# 类的内置方法
# 双下方法
# __str__
# 当类中定义了__str__方法后,print(这个类对象时),会调用__str__. 或者格式化%s输出对象时,都会触发__str__
# __repr__
# 当类中定义了__repr__方法后,print(repr(a)),就会调用a对象中的__repr__()方法。格式化输出用%r时同样会调用__repr__
# 同样对象中如果没有定义__repr__方法,那么就会调用父类中的__repr__
# __repr__是__str__的备胎,str不能做repr的备胎,当类内部没有定义str时,想要调用类的str方法,则会调用repr方法
# 如果没有__str__方法,会先找本类中的__repr__方法,如果还没有找到再从父类中的__str__找,没有再找__repr,但object基类肯定定义了这两个方法
# repr(),只会找__repr__,如果没有__repr__则会找父类的__repr__
# object里有一个__str__,一旦被调用,就返回调用对象的内存地址
# print(对象) # 打印一个对象的时候,就是调用对象.__str__,如果对象中没有定义__str__方法,则会调用基类object中的__str__,就会打印对象的内存地址
class A:
def __init__(self, name):
self.name = name
def __str__(self): # 此类定义的对象,被格式化%s输出或者print打印时或print(str(obj))会触发此方法
return 'A'
def __repr__(self): # 此类定义的对象,被格式化%r输出或者print打印时或print(repr(obj)),会触发此方法
return str(self.__dict__)
a = A('why')
print(a) # A 如果没有定义__str__方法,则会调用父类object的__str__
print(str(a)) # A 如果没有定义__str__方法,则会调用父类object的__str__
print('%s : %s' % ('A', a)) # A : A # 格式化输出对象a,也会调用a的__str__
print(repr(a)) # {'name': 'why'}
print('%r' % a) # {'name': 'why'}
# 析构函数 __del__
class A:
def __init__(self):
self.name = 'why'
def __del__(self):
print('执行我了')
a = A()
del a # 调用此方法后,先执行析构函数__del__方法,之后删除了这个对象.如果自己没有删除,在程序运行结束后,解释器会进行析构删除
# __call__
# 一个对象obj,如果obj()就会调用__call__方法
class A:
def __init__(self):
self.name = 'why'
def __call__(self):
print('执行我了')
a = A() #
a() # 执行我了 # 调用了对象__call__方法
# __getitem__\__setitem__\__delitem__ # 使用字典的形式操作对象的属性
class Foo:
def __init__(self, name):
self.name = name
def __getitem__(self, item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key):
print('del obj[key]时, 我执行')
self.__dict__.pop(key)
def __delattr__(self, item):
print('del obj.key 时,我执行')
self.__dict__.pop(item)
f1 = Foo('sb')
f1['age'] = 18 # 调用了类的__setitem__方法,增加了一个属性age,值为18
f1['age1'] = 19 # 实际调用了__setitem__方法
print(f1['age1']) # 19 # 实际调用了__getitem__方法
del f1.age1 # 3 del obj.key 时,我执行
del f1['age'] # del obj[key]时, 我执行
# __new__
class A:
def __init__(self):
self.x = 1
print('in init function')
def __new__(cls, *args, **kwargs): # 此方法才是实例化时,先被调用的方法,此方法造出了self,一般我们不用实现
print('in new function')
return object.__new__(A, *args, **kwargs)
a = A() # in new function
# in init function