补上篇:
定义实例:
实例名 = 类名.(除了self以外的所有参数)
def __init__
中设置的参数都是在定义实例的时候输入的,因此算作实例的属性
定义类属性:直接在class
下面输入如 name = 'student'
然后类中所有的实例均可以调用类属性 实例名.类属性名
也可以直接用类来调用 类名.类属性名
由于实例属性优先级比类属性高,因此,定义了实力属性以后会覆盖类属性
但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
(如何删除??)
调用属性:
>>> class a(object):
... def __init__(self,name):
... self.name = name
...
>>> lalala = a(la)
Traceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'la' is not defined```
`__init__`中的`name`等属性系统有自动的识别,输入必须是str类型
-----
查看数据类型:`type(a)`,此时显示的都是**最小的子类**
但其实通过继承,也属于所有的父类,所以可以用`isinstance(a,type)`来判断
类似`__xxx__`的属性和方法在Python中都是有特殊用途的,比如`__len__`方法返回长度。
在Python中,如果你调用`len()`函数试图获取一个对象的长度,实际上,在len()函数内部,它定义了去调用该对象的`__len__()`方法。
**对某些函数理解:**
函数len()的定义内部调用`__len__`,如果你的类内部没有`__len__`方法,则不可以使用`len()`调用类,你也可以为自己的函数内部定义一个`__len__`方法,然后使用`len()`函数后会调用你定义的方法。
-------
hasattr(obj, 'x') # 有属性'x'吗?
getattr(obj, 'x') #获得属性'x'
setattr(obj, 'y',值) # 设置一个属性'y'
属性名一定是string类型
`getattr()`在已知如何直接调用函数内部属性的情况下不需要这样写,如
`obj.x`
如果试图获取不存在的属性,会抛出AttributeError的错误:
getattr(obj, 'z')
Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'MyObject' object has no attribute ‘z’
可以传入一个default参数,如果属性不存在,就返回默认值:
getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404```