• 双下方法,我们又称之为魔法方法 ```python python中对象内置的方法,这些方法有特殊的触发行为 __init__就是在加上()被实例化的时候触发了 了解双下方法可以帮助我们理解python对象的运行形式 有些时候可以改写双下方法来达到特殊的目的 ``` • __init__(self,...,...) ```python # 构造函数,创建对象时自动调用,初始化对象,默认返回None,不用写return # 类继承时,若子类有__init__,还想要调用父类的__init__,则需要手动在子类的__init__中调用super().__init__(); 若没有,会自动调用 # class A: # def __init__(self,name): # self.name=name # # # class B(A): # # def __init__(self,name,sex): # # self.sex=sex # # super().__init__(name) # pass # # # b=B() # 报错 TypeError: __init__() missing 1 required positional argument: 'name' # c=B('xx') # 必须写上父类需要的参数 # print(c.__dict__) ``` • __new__(cls,...,...),以下简称new ```python # __new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器。 # new只负责创建,返回一个空对象,然后由init来初始化,所以在创建对象的时候最先执行的是new # new至少要一个参数cls,代表要实例化的类(并不是对象),此参数在实例化时有python解释器自动提供 # 在自己实现new时要注意:new必须要有返回值,返回实例化出来的实例 # 在实际中很少会用到new,除非希望控制类的创建,这需要牵扯到metaclass(元类)的介绍 # class A: # def __init__(self): # self.x=1 # print('这是init方法') # # def __new__(cls, *args, **kwargs): # print('这是new方法') # # return object.__new__(cls) # 覆盖__new__的时候别忘了return object中的new,没有这句话只会调用new方法,不在再去调用init方法初始化对象 # / # return object.__new__(cls, *args, **kwargs) # # a=A() # print(a.x) # new不返回对象,报错:AttributeError: 'NoneType' object has no attribute 'x' ``` • __del__(self) ```python # 1、python中del可以认为是析构函数了,在一个实例被销毁时它会执行,是由解释器自动调用的,一般情况下不重写 # 2、这涉及到python的垃圾回收机制,当有一个变量保存了对象的引用时,此对象的引用计数就会加1,当使用del删除变量指向的对象时,对象的引用计数会减1,当对象的引用 # 计数为0是,对象被删除,关于python的垃圾回收机制,单独学习 # del方法作用在变量上,而不是数据对象上 # del作用于类实例和类实例属性是两种不同的情况,前者触发__del__(),而后者才触发__delattr__() # class A: # def __del__(self): # print('del函数被调用') # # a1=A() # a2=a1 # del a2 ``` • __str__(self) ```python # 该方法继承于object,用print打印对象时会默认调用该方法的得到关于类的信息,该方法又称为自我描述方法 # 当使用print输出对象的时候,只要自己定义了str方法,那么就会打印从这个方法中return的数据,类似于java中System.out.println()会自动调用的toString方法 # class A: # def __init__(self): # pass # def __str__(self): # return 'hahahha' # # a = A() # print(type(a)) # a为对象,但是在打印出来的时候显示为__str__的返回值 # print(a) ``` • __repr__(self) ```python # str和repr的区别就是repr面向机器,str面向人,定义类的输出的时候经常会使用这两个魔法 # str():将值转化为适合人阅读的字符串的形式(给人看) # repr():将值转化为供解释器读取的字符串形式(给机器看) # 若没有定义str,print直接调用的是repr方法,打印str()输出的也是repr返回的值 # 如果将对象放在容器中进行输出,调用的是repr方法 # class A: # def __str__(self): # return 'str' # # def __repr__(self): # return 'repr' # # # pass # # # a = A() # print(a) # print(str(a)) # print(repr(a)) # # b=A() # c=A() # li=[a,b,c] # print(li) ``` 。。。。。。 最后修改:2021 年 11 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 ¥¥阿巴阿巴¥¥
4 条评论
老话题新解读,展现了深刻的反思精神。
在现有基础上可尝试多媒介形式呈现。
博主太厉害了!
想想你的文章写的特别好https://www.ea55.com/