河间市,非主流帅哥照片,洛德斯图尔特
首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法。
之前我们是这样给对象添加属性的:
class student: pass stu1 = student() stu1.name = "张三" stu1.age = 18
**现在我们利用__init__()方法简化代码**
class student: def __init__(self, name, age): self.name = name self.age = age stu1 = student("张三", 18)
是不是代码看起来简洁多了呢
**没有定义__str __()方法时:**
class student: def __init__(self, name, age): self.name = name self.age = age stu1 = student("张三", 18) print(stu1) s = str(stu1) print(s) """ 输出结果: <__main__.student object at 0x03c3bcd0> <__main__.student object at 0x03c3bcd0> """
没有定义__str __()方法时,它默认返回该对象的内存地址。
**定义了__str __()方法是这样的:**
class student: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return "姓名:%s\t年龄:%d"%(self.name, self.age) stu1 = student("张三", 18) print(stu1) s = str(stu1) print(s) """ 输出结果: 姓名:张三 年龄:18 姓名:张三 年龄:18 """
当删除一个对象时,python解释器会默认调用一个方法,这个方法为__del__()方法。
首先应该先了解一个概念,那就是对象的引用个数。我们需要sys模块中的getrefcount()用来测量一个对象的引用个数,返回值=实际的引用个数+1。若返回2则说明该对象的实际引用个数为1,此时有1个变量引用了该对象。
import sys class a: pass a = a() # 现在只有变量a引用了a类创建的对象 print(sys.getrefcount(a)) """ 输出结果: 2 """ # 那么现在再创建一个变量b,也引用a所引用的对象,那么它的引用个数就会加1,实际引用个数变成2. b = a print(sys.getrefcount(a)) """ 输出结果: 3 """
当python解释器检测到,这个对象的实际引用个数为0时,就会删除这个对象,此时也就会相应的调用__del __()方法。还有一种情况就是该程序已经全部执行完了,那么相应的内存会被释放掉,它也会执行__del __()方法。
这是程序正常执行完的情况:
import sys class a: def __del__(self): print("该对象被销毁") a = a() """ 输出结果: 该对象被销毁 """
还有一种是手动删除变量引用的情况:
import sys class a: def __del__(self): print("该对象被销毁") a = a() # 此时实际引用个数为1 b = a # 此时实际引用个数为2 print("删除了变量a") del a # 删除变量a,此时实际引用个数为1 print("删除了变量b") del b # 删除变量b,此时实际引用个数为0,python解释器就会删除该对象,即调用__del __()方法 print("程序结束") """ 输出结果: 删除了变量a 删除了变量b 该对象被销毁 程序结束 """
class a: def __init__(self): print("调用了init方法") def __new__(cls): print("调用了new方法") return super().__new__(cls) a = a() """ 输出结果: 调用了new方法 调用了init方法 """
class a: # 定义一个私有的类属性,用于存储实例化出来的对象 _isinstance = none def __new__(cls): print("调用了new方法") # 判断如果_isinstance为none,则创建一个实例,否则直接返回_isinstance if not cls._isinstance: cls._isinstance = super().__new__(cls) return cls._isinstance print(id(a)) print(id(a)) print(id(a)) print(id(a)) """ 输出结果: 19888488 19888488 19888488 19888488 """
我们都知道python是一门动态语言,可以在程序运行的过程中添加属性。如果我们想要限制实例的属性该怎么办?例如,只允许对person实例添加name和age属性。
为了达到限制的⽬的,python允许在定义class的时候,定义⼀个特殊的 __slots__变量,来限制该class实例能添加的属性:
class person(object): __slots__ = ("name", "age") p = person() p.name = "⽼王" p.age = 20 p.score = 100 """ 输出结果: traceback (most recent call last): file "<input>", line 6, in <module> attributeerror: 'person' object has no attribute 'score' """
注意:使⽤__slots__要注意,__slots__定义的属性仅对当前类实例起作⽤,对 继承的⼦类是不起作⽤的。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论