可以理解为Python为类自动创建的方法,它们都具有特殊的意义,常用的特殊方法有:
__init__ | 构造方法 | 对象创建:p = Person() |
__del__ | 析构方法 | 对象回收 |
__repr__,__str__ | 打印,转换 | print(a) |
__call__ | 函数调用 | a() |
__getattr__ | 点号运算 | a.xxx |
__setattr__ | 属性赋值 | a.xxx = value |
__getitem__ | 索引运算 | a[key] |
__setitem__ | 索引赋值 | a[key]=value |
__len__ | 长度 | len(a) |
除了特定的方法,Python还对运算符方法进行了定义:
运算符+ | __add__ | 加法 |
运算符- | __sub__ | 减法 |
<,<=,== | __lt__,__le__,__eq__ | 比较运算符 |
>,>=,!= | __gt__,__ge__,__ne__ | |
|,^,& | __or__,__xor__,__and__ | 或、异或、与 |
<<,>> | __lshift__,__rshift__ | 左移、右移 |
*,/,%,// | __mul__,__truediv__,__mod__,__floordiv__ | 乘、浮点除、模运算(取余)、整数除 |
** | __pow__ | 指数运算 |
改写以上的方法,实际就是对运算符进行了重载:
- class Complex:
- def __init__(self,real,img):
- self.real = real
- self.img=img
- def __add__(self, other):
- if isinstance(other,Complex):
- return Complex(self.real + other.real,self.img + other.img)
- c1=Complex(1.2,5.3)
- c2=Complex(2.0,0.3)
- x=c1+c2
- print(x.real,x.img) #输出 3.2 5.6
加法运算的结果需要返回一个Complex对象,所以需要return
Python对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。
特殊方法 | 含义 |
obj.__dict__ | 对象的属性字典 |
obj.__class__ | 对象所属的类 |
class.__bases__ | 类的基类元组(多继承) |
class.__base__ | 类的基类 |
class.__mro__ | 类层次结构 |
class.__subclasses__() | 子类列表 |
单例模式是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点。 一般可以通过__new__()的方法来实现:
- class MySingleton:
- __obj = None
- __flag = False
- def __new__(cls, *args, **kwargs):
- if cls.__obj == None:
- cls.__obj = object.__new__(cls)
- return cls.__obj
- def __init__(self, name):
- if not MySingleton.__flag:
- self.name = name
- MySingleton.__flag = True
- a = MySingleton("aa")
- print(a)
- b = MySingleton("bb")
- print(b)
通过 __obj 判断是否存在对象,来实现内存的分配,通过 __flag 判断对象是否调用构造函数类实现变量的初始化(name)
输出结果:
<__main__.MySingleton object at 0x019862F0>
<__main__.MySingleton object at 0x019862F0>
可见 ,a和b实质是同一个对象。