这里写目录标题
回顾 :自省
hasattr(obj,‘属性’) #obj.属性 是否存在
getattr(obj,‘属性’) #获取obj.属性 不存在则报错
getattr(obj,‘属性’,‘默认值’) #获取obj.属性 不存在不会报错,并返回默认值
setattr(obj,‘属性’,‘属性的值’) #obj.属性=属性的值
delattr(obj,‘属性’) #del obj.属性
class提供的内置函数(不重写则执行系统默认的)
除了__ getattr__(可用来做授权功能)其他的很少用
__getattr__、__setattr__、__delattr__
obj点的方式去操作属性时触发的方法
注:这里的这些和上面自省的是没有联系的
__getattr__:obj.属性 不存在的时候触发
__setattr__:obj.属性=属性的值 时触发
__delattr__:del obj.属性 时触发
__getitem__、__setitem__、__delitem__
obj[‘属性’]的方式去操作属性时触发的方法
__getitem__:obj['属性'] 时触发
__setitem__:ob['属性']=属性的值 时触发
__delitem__:del obj['属性'] 时触发
__get__、__set__、__delete__
描述就是一个新式类,这个类至少要实现上述三个方法的一个
class 描述符:
def __get__():
pass
def __set__():
pass
def __delete__():
pass
class 类:
name=描述符()
obj=类()
obj.name #触发get
obj.name='alex' #触发set
del obj.name #触发delete
__str__、__repr__
'''
当类中没有__str__时,它默认打印内容如下,对于使用者来说有用的信息只有__main__.Foo
当我们回想要他打印的只有有用给的信息或者其他需要的信息,这时就需要用到__str__
'''
class Foo:
pass
f1=Foo()
print(f1)
结果:
<__main__.Foo object at 0x000000C96C398EB8>
#注:__str__()返回的只能是字符串
class Bar:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return 'Bar(%s,%s)'%(self.name,self.age)
b1=Bar('alex',18)
print(b1)
str(b1)#-->b1.__str__()
结果:
Bar(alex,18)
'Bar(alex,18)'
class Foo:
def __repr__(self):
return 'as123'
f1=Foo()
print(f1)
结果:as123
__slots__
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
然后,我们试试:
>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
__doc__
查看类的文档信息
class Foo:
'我是描述信息'
pass
class Bar(Foo):
pass
print(Foo.__doc__)
print(Bar.__doc__) #该属性无法继承给子类
结果:
我是描述信息
None
__module__、__class__
查看对象在哪个模块,查看对象是由哪个类产生的
class C:
def __init__(self):
self.name = ‘SB'
from lib.aa import C
obj = C()
print obj.__module__ # 输出 lib.aa,即:输出模块
print obj.__class__ # 输出 lib.aa.C,即:输出类
__call__
对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__