在前面,我們通過isinstance()方法,可以判斷一個對象是否是某個類型,從某種意義上來講,通過isinstance()方法,我們獲取到了一個對象的一些信息,那有沒有別的方法可以獲取到對象更多的信息呢?
通過type()函數(shù),可以獲得變量的類型。
n = 1 s = 'this is a string' type(n) # ==> <class 'int'> type(s) # ==> <class 'str'>
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score p = Person('Alice', 'Female') s = Student('Bob', 'Male', 100) type(p) # ==> <class '__main__.Person'> type(s) # ==> <class '__main__.Student'>
通過dir()方法,可以獲取變量的所有屬性:
>>> n = 1 >>> dir(n) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', ...] >>> s = 'this is a string' >>> dir(s) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', ...]
在dir列出的屬性中,有很多是以下劃線開頭和結(jié)尾的,這些都是特殊的方法,稱為內(nèi)建方法,在后面,我們還會學(xué)習(xí)這些方法。
而對于自定義對象:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def who(self): return 'I am a Person, my name is {}'.format(self.name) p = Person('Alice', 'Female') dir(p) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name', 'who']
對于實(shí)例變量,dir()返回所有實(shí)例屬性,包括__class__這類有特殊意義的屬性。注意到方法who也是p的一個屬性。
dir()返回的屬性是字符串列表,如果已知一個屬性名稱,要獲取或者設(shè)置對象的屬性,就需要用 getattr() 和 setattr( )函數(shù)了。
?>>> getattr(p, 'name') # 獲取name屬性 'Alice' >>> setattr(p, 'name', 'Adam') # 設(shè)置新的name屬性 >>> s.name 'Adam' >>> getattr(s, 'age') # 獲取age屬性,但是屬性不存在,報錯: Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute 'age' >>> getattr(s, 'age', 20) # 獲取age屬性,如果屬性不存在,就返回默認(rèn)值20: 20
對于Person類的定義:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender
希望除了name和gender外,可以提供任意額外的關(guān)鍵字參數(shù),并綁定到實(shí)例,請修改 Person 的__init__()定義,完成該功能。
提示:結(jié)合在入門課程學(xué)習(xí)的向函數(shù)傳遞任意關(guān)鍵字參數(shù)的方法以及剛剛學(xué)習(xí)的setattr()方法。
參考答案:
class Person(object): def __init__(self, name, gender, **kw): self.name = name self.gender = gender for k, v in kw.items(): setattr(self, k, v) p = Person('Bob', 'Male', age=18, course='Python') print(p.age) print(p.course)
請驗(yàn)證,完成請求
由于請求次數(shù)過多,請先驗(yàn)證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報