在前面,我们通过isinstance()方法,可以判断一个对象是否是某个类型,从某种意义上来讲,通过isinstance()方法,我们获取到了一个对象的一些信息,那有没有别的方法可以获取到对象更多的信息呢?
通过type()函数,可以获得变量的类型。
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列出的属性中,有很多是以下划线开头和结尾的,这些都是特殊的方法,称为内建方法,在后面,我们还会学习这些方法。
而对于自定义对象:
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']
对于实例变量,dir()返回所有实例属性,包括__class__这类有特殊意义的属性。注意到方法who也是p的一个属性。
dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了。
>>> getattr(p, 'name') # 获取name属性 'Alice' >>> setattr(p, 'name', 'Adam') # 设置新的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属性,如果属性不存在,就返回默认值20: 20
对于Person类的定义:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender
希望除了name和gender外,可以提供任意额外的关键字参数,并绑定到实例,请修改 Person 的__init__()定义,完成该功能。
提示:结合在入门课程学习的向函数传递任意关键字参数的方法以及刚刚学习的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)
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报