• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

关闭

返回栏目

关闭

返回python栏目

26 - 语法 - def __xx__()魔法方法 - 需要自己定义

作者:

贺及楼

成为作者

更新日期:2024-05-25 13:33:01

__xx__()魔法方法 - 需要自己定义

自定义方法汇总

分类 方法 说明 作用
基本 __new__(cls[, ...]) 创建对象的方法,当通过类去创建对象时就是调用new方法去创建的 单例模式
基本 __init__(self[, ...]) 初始化方法,当实例被创建的时候调用的初始化方法
基本 __del__(self) 析构方法,当实例被销毁的时候调用的方法
基本 __call__(self[, args...]) 类装饰器,允许一个类的实例像函数一样被调用:x(a, b) 调用 x.call(a, b)
容器类型数据 __len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数)
容器类型数据 __contains__(self, item) 定义当使用成员测试运算符(in 或 not in)时的行为

__new__(cls[, ...])可用单例模式

  1. class Dog():
  2. # 优先级1
  3. # 单例模式(只能创建一个)
  4. # 音乐播放 对象(同时播一首歌)
  5. # 回收站 对象(同时都扔到一个垃圾桶)
  6. # 打印机 对象(同时打一份)
  7. instance = None # 记录第一个被创建对象的引用
  8. init_flag = False # 记录是否执行过初始化动作
  9. def __new__(cls, *args, **kwargs):
  10. if cls.instance is None: # 1. 判断类属性是否已经被赋值
  11. cls.instance = super().__new__(cls)
  12. return cls.instance # 2. 返回类属性的单例引用
  13. # 必须返回一个对象,否则不跑__new__()方法
  14. def __init__(self, name):
  15. self.name = name
  16. if __name__ == "__main__":
  17. my_dog_1 = Dog('A')
  18. print(my_dog_1)
  19. my_dog_1.color = "yellow"
  20. print(my_dog_1.name)
  21. my_dog_2 = Dog('B')
  22. print(my_dog_2)
  23. print(my_dog_2.name)
  24. print(my_dog_2.color) # 修改了my_dog_1,但是my_dog_2也被修改了
  1. <__main__.Dog object at 0x7f95802d9a50>
  2. A
  3. <__main__.Dog object at 0x7f95802d9a50>
  4. B
  5. yellow

__init__(self[, ...])

  1. class Dog():
  2. def __init__(self, name):
  3. self.name = name
  4. if __name__ == "__main__":
  5. my_dog_1 = Dog('A')
  6. print(my_dog_1)
  7. print(my_dog_1.name)
  8. my_dog_2 = Dog('B')
  9. print(my_dog_2) # 2个的内存空间不一样
  10. print(my_dog_2.name)
  1. <__main__.Dog object at 0x7fb640219e50>
  2. A
  3. <__main__.Dog object at 0x7fb640219d90>
  4. B

__del__(self)

  1. class Dog():
  2. def __init__(self, name):
  3. self.name = name
  4. # 对象被删除(内存删除了)后会用
  5. # del my_dog
  6. # 出个告警?
  7. def __del__(self):
  8. print("__del__方法被调用")
  9. if __name__ == "__main__":
  10. my_dog_1 = Dog('A')
  11. print(my_dog_1)
  12. print(my_dog_1.name)
  1. <__main__.Dog object at 0x7fbf28219e90>
  2. A
  3. __del__方法被调用

__call__(self[, args...])

  1. class Dog():
  2. def __init__(self, name):
  3. self.name = name
  4. # 可以让my_dog成为可调用对象
  5. # my_dog('W', 6)
  6. def __call__(self,age):
  7. self.age = age
  8. print("调用__call__()方法",age)
  9. if __name__ == "__main__":
  10. my_dog_1 = Dog('A')
  11. my_dog_1(23)
  12. print(my_dog_1.age)
  1. 调用__call__()方法 23
  2. 23

__len__(self)长度

  1. class Dog_1(object):
  2. def __init__(self, age):
  3. self.age = age
  4. self.li = ['a', 'v', 's']
  5. class Dog(object):
  6. def __init__(self, age):
  7. self.age = age
  8. self.li = ['a', 'v', 's']
  9. def __len__(self):
  10. return len(self.li)
  11. U = Dog(12)
  12. print(len(U)) # 3
  13. U = Dog_1(12)
  14. print(len(U)) # 'Dog_1' has no len()

__contains__(self, item)是否包含

  1. class Student():
  2. def __init__(self,name):
  3. self.name=name
  4. def __contains__(self,item):
  5. return item in self.name
  6. s=Student("Jack")
  7. print("J" in s)
  8. ## True