几个类的内置方法
Posted whylinux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几个类的内置方法相关的知识,希望对你有一定的参考价值。
# 类的内置方法 # 双下方法 # __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
以上是关于几个类的内置方法的主要内容,如果未能解决你的问题,请参考以下文章