Python
開發(fā)中,我們常常用到反射機(jī)制,它主要是字符串與模塊應(yīng)用之間的連接方法,核心是將字符串轉(zhuǎn)換成可以調(diào)用的模塊、模塊方法的變量。今天和大家分享的主要是反射機(jī)制中參數(shù)問題的處理相關(guān)內(nèi)容,一起來看看吧,希望對大家
學(xué)習(xí)python有所幫助。
首先給大家介紹下
以下四個方法:
hasattr(obj, name, /)
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
hasattr()
是檢測
obj
里面是否包含了
name
屬性(函數(shù)、方法
……
),
hasattr()
返回
True
或者
False
。
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case.
getattr()
用來調(diào)用
object.name
,一般可將其賦值給其他變量。
default
是可選項(xiàng),同樣是
object.name
不存在的條件下,在不填的時候?qū)⒎祷?/span>
AttributeError
;如果設(shè)置了
default
值,則返回用戶設(shè)置的
default
值。
setattr(obj, name, value, /)
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to “x.y = v”
setattr()
設(shè)置一個
obj.name = value
,也就是說設(shè)置一個新的方法(函數(shù))到對象里面。
delattr(obj, name, /)
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''
delattr()
刪除
obj.name
,把對象里不需要的方法(屬性)去除。
設(shè)置一個十分簡單的人物屬性代碼
class
role(object):
n = "zzh"
date = "2018"
def
__init__(self, name, weapon, clothes, live = 100):
self.name = name
self.weapon = weapon
self.clothes = clothes
self.live = live
def
buy_weapon(self, weapon_name):
print("%s buy a %s" %(self.name, weapon_name))
def
got_headshoot(self):
print("%s got headshot!" %self.name)
self.live -= 50
def
show_inner(self):
print("Live is %s" %self.live)
def
__del__(self):
print("Game Over!")
role_default = role("zzz", "AWM", "3-level")
while
True:
command = input('action:')
if hasattr(role_default, command):
command_act = getattr(role_default,command)
command_act()
else:
print('Command not exists!')
在運(yùn)行的過程中,command
輸入除了
buy_weapon
以外的字符串都是沒有問題的。
那就來找找看buy_weapon
這個函數(shù)跟其他方法有什么不同呢?
原來是buy_weapon
是一個帶有兩個參數(shù)的函數(shù)
'weapon_name'
。那我們來看一下報錯信息:
TypeError: buy_weapon() missing 1 required positional argument: 'weapon_name'
跟我們猜測的一樣,果然是少了一個參數(shù)。
定位到代碼上,我們可以知道Error
出現(xiàn)在:
command_act()
也就是command_act
調(diào)用的時候缺少了參數(shù)
'weapon_name'
,于是我們想到了一個笨拙的方法(傳參
1.0
):
while True:
command = input('action:')
if hasattr(role_default,
command):
command_act = getattr(role_default,
command)
try:
command_act()
except TypeError:
factor = input('Needing a extra factor:')
command_act(factor)
else:
print('Command not exists!')
我們只需要簡單的添加一下try
判斷,如果判斷出來
TypeError
就給他傳個參數(shù)就好了唄!
在代碼后期的拓展中發(fā)現(xiàn),我們要傳兩個參數(shù)怎么辦??結(jié)果是我們又缺少了一個參數(shù),那如果以后要傳三個、四個、甚至一萬個參數(shù)呢?
我們必須要找到一個方法一勞永逸地解決這個問題!首先,我們可以知道的是,所有的參數(shù)都是依賴用戶輸入的,也就是如果有一萬個參數(shù),用戶則需要輸入一萬次。
于是我們聯(lián)想到了循環(huán),通過判斷TypeError
出現(xiàn)與否來實(shí)現(xiàn)循環(huán)輸入,只要運(yùn)行結(jié)果是
TypeError
我們就繼續(xù)輸入?yún)?shù)直到滿足函數(shù)的需求。
來源:
博客園