特殊属性
属性 | 含义 |
---|
name | 类、函数、方法等的名字 |
module | 类定义所在的模块 |
class | 对象或类所属的类 |
bases | 类的基类的元组,顺序为它们在基类列表中出现的顺序 |
doc | 类、函数的文档字符串,如果没有定义则为None |
mro | 类的mro,class.mro()返回的结果的保存在__mro__中 |
dict | 类或实例的属性,可写的字典 |
查看属性
方法 | 意义 |
---|
dir | 返回类或者对象的所有成员名称列表。dir()函数操作实例就是调用__dir__() |
如果dir([obj])参数obj包含方法__dir__(),该方法将被调用。如果参数obj不包括__dir__(),该方法将最大限度地收集属性信息。
dir(obj)对于不同类型的对象obj具有不同的行为:
- 如果对象是模块对象,返回的列表包含模块的属性名和变量名
- 如果对象是类型或者说是类对象,返回的列表包含类的属性名,及它的祖先类的属性名
- 如果是类的实例
- 有__dir__方法,返回可迭代对象的返回值
- 没有__dir__方法,尽可能收集实例的属性名、类的属性和祖先类的属性名
- 如果obj不写,返回列表包含内容不同
- 在模块中,返回模块的属性和变量名
- 在函数中,返回本地作用域的变量名
- 在方法中,返回本地作用域的变量名
内建函数:
- locals()返回当前作用域中的变量字典
- globals()当前模块全局变量的字典
魔术方法
- 分类:
- 创建、初始化与销毁
- 可视化
- hash
- bool
- 运算符重载
- 容器和大小
- 可调用对象
- 上下文管理
- 反射
- 描述器
- 其他杂项
实例化
|方法|意义 |
|–|--|
|new |实例化一个对象,该方法需要返回一个值,如果该值不是cls的实例,则不会调用__init__,该方法永远都是静态方法 |
class A:
def __new__(cls,*args,**kwargs):
print(cls)
print(args)
print(kwargs)
return None
def __init__(self,name):
self.name=name
a=A()
print(a)
__new__方法很少使用,即使创建了该方法,也会使用return super().new(cls)基类object的__new__方法开创建实例并返回。
可视化
方法 | 意义 |
---|
str | str()函数、format()函数、print()函数调用,需要返回对象的字符串表达。如果没有定义,就去调用__repr__没有定义,就直接返回对象的内存地址信息 |
repr | 内建函数repr()对一个对象获取字符串表达。调用__repr__方法返回字符串表达,如果.__repr__也没有定义,就直接返回object的定义就是显示内存地址信息 |
bytes | bytes() 函数调用,返回一个对象的bytes表达,即返回bytes对象 |
class A:
def __init__(self,name,age=18):
self.name=name
self.age=age
def __repr__(self):
return '{}{}'.format(self.name,self.age)
def __str__(self):
return '{}{}'.format(self.name,self.age)
def __bytes__(self):
return (self.name,self.age)
a=A('tom')
print(a)
print("{}".format(A('tom')))
print([A('tom')])
print([str(A('tom'))])
hash
方式 | 意义 |
---|
hash | 内建函数hash()调用的函数值,返回一个整数。如果定义这个方法该类的实例就可hash |
print(hash(1))
print(hash('tom'))
print(hash(('tom',)))
eq
方法 | 意义 |
---|
eq | 对应==操作符,判断2个对象是否相等,返回bool值,定义了这个方法,如果不提供__hash__方法,那么实例将不可hash |
__hash__方法只是返回一个hash值作为set的key,但是去重,还需要__eq__来判断2个对象是否相等,hash相等,只是hash冲突,不能说明两个对象是相等的。
因此,一般来说提供__hash__方法是为了作为set或者dict的key,如果去重要同时提供__eq__方法。不可hash对象isinstance(p1,collections.Hashable)一定为False
bool
方法 | 意义 |
---|
bool | 内建函数bool(),或者对象放在逻辑表达式的位置,调用这个函数返回布尔值,没有定义__bool__(),就找__len__()返回长度。非0为真。如果__len__()也没有定义,那么所有实例都返回真 |
class A:pass
print(bool(A()))
class B:
def __bool__(self):
return False
print(bool(B))
print(bool(B()))
class C:
def __len__(self):
return 1
print(bool(C()))
运算符重载
operater模块提供了以下的特殊方法,可以将类的实例使用下面的操作符来操作
运算符 | 特殊方法 | 含义 |
---|
<,<=,==,>,>=,!= | lt,le,eq,gt,ge,__ne | 比较运算符 |
+,-,-=,/,%,//,**,divmod | add,sub,mul,truediv,mod,floordiv,pow,divmod | 算数运算符名,移位、位运算也有对应的方法 |
+=,-=,*=,/=,%=,//=,**= | iadd,isub,imul,itruediv,imod,ifloordiv,ipow | |
容器相关方法
方法 | 意义 |
---|
len | 内建函数len(),返回对象的长度(>=0的整数) ,如果把对象当做容器类型看,就如同list或者dict. bool()函数调用的时候,如果没有__bool__()方法,则会看__len()方法是否存在,存在返回非0为真 |
iter | 迭代容器时,调用,返回一个新的迭代器对象 |
contains | in 成员运算符,没有实现,就调用__iter__方法遍历 |
getitem | 实现self[key]访问,序列对象,key接受整数为索引,或者切片,对于set和dict,key为hashable,key不存在引发keyerror一场 |
setitem | 和___getitem__的访问类型类似,是设置值得方法 |
missing | 字典或其子类使用__getitem__()调用时,key不存在执行该方法 |
可调用对象
Python中一切皆对象,函数也不例外
方法 | 意义 |
---|
call | 类中定义一个该方法,实例就可以像函数一样调用 |