04魔法方法
- 钩子:特定时间发生时,能够为响应时间而调用的代码或函数;回调函数就算是钩子的一种类型。
0421 创建与销毁
-
__init__
方法并不返回任何值,如果使用return
则会出现TypeError
-
__new__
在__init__
之前执行,用于创建并返回类的实例-
用于是静态的,无需显示装饰,第一个参数是创建实例所需要的类(习惯命名
cls
) -
__new__
方法的其它参数会被完整的复制到__init__
中,参数在调用类构造函数时,首先会传递给__new__
,然后才是__init__
-
通过
__new__
方法返回当前类的实例时才会执行__init__
方法class Myclass: def __new__(cls, *args, **kwargs): instance = super(Myclass, cls).__new__(cls, *args, **kwargs) # [do work on instance] return instance
-
-
__del__
对象销毁时自动调用
0422 类型转换
-
__str__
接受一个位置参数(self), 并在对象被传递给str
的构造函数时,返回一个字符串class MyObject: def __str__(self): return "返回字符串" # def __unicode__(self): # return u"unicode" print(str(MyObject())) print(u'The %s was used'%MyObject())
-
__bool__
__int__
__float__
__complex__
0423 比较
-
__eq__
等于__ne__
不等于 (针对__eq__
结果取反) -
__lt__
__le__
__gt__
__ge__
分别对应 < 、<=、 >、 >= -
操作重载
-
二元操作符( + - 等)
- 普通方法(vanilla method) x + y 匹配
x.__add__(y)
- 取反方法(reverse method) 对于表达式
x+y
如果没有__add__
方法,则调用y.__radd__(x)
- 即席方法(in-place method) 对于
x += y
调用x.__iadd__(y)
- 普通方法(vanilla method) x + y 匹配
-
操作符 方法 取反 即席 + __add__
__radd__
__iadd__
- __sub__
__rsub__
__isub__
* __mul__
__rmul__
__imul__
/ __truediv__
__rtruediv__
__itruediv__
// __floordiv__
__rfloordiv__
__ifloordiv__
% __mod__
__rmod__
__imod__
** __pow__
__rpow__
__ipow__
& __and__
__rand__
__iand__
| __or__
__ror__
i__or__
^ __xor__
__rxor__
i__xor__
<< __lshift__
__rlshift__
__ilshift__
>> __rshift__
_r_rshift__
__irshift__
-
一元操作符
-
__pos__(与+匹配) __neg__(与-匹配) __invert__(与~匹配)
class ReversibleString: def __init__(self, s="The quick brown fox jumped over the lazy dogs"): self.s = s # def __invert__(self): # return type(self)(self.s[::-1]) def __invert__(self): return self.s[::-1] def __str__(self): return self.s rs = ReversibleString() print(~rs) # print(~~rs)
-
-
重载常见方法:将对象作为操作符。
''' __len__ __repr__:让对象成为更有用的代表值 __hash__ __format__ __instancecheck__ __subclasscheck__ __abs__ __round__ ''' class Timespan: def __init__(self, hours=0, minutes=0, seconds=0): self.hours = hours self.minutes = minutes self.seconds = seconds def __len__(self): return self.hours * 3600 + self.minutes * 60 + self.seconds def __repr__(self): return 'Timespan(hours={}, minutes={}, seconds={})'.format(self.hours, self.minutes, self.seconds) ts = Timespan(2, 30, 1) print(len(ts)) print(ts)
from datetime import datetime class MyDate(datetime): def __format__(self, format_spec): if not format_spec: format_spec = "%Y-%m-%d %H:%M:%S" return self.strftime(format_spec) md = MyDate(2021, 12, 4, 20, 36) print("{}".format(md)) print("{:%Y-%m-%d}".format(md))
-
-
集合
-
__contains__
from datetime import date class DateRange: def __init__(self, start, end): self.start = start self.end = end def __contains__(self, item): return self.start <= item <= self.end dr = DateRange(date(2015, 1, 1), date(2015, 12, 31)) print(date(2015, 12, 12) in dr)
-
__getitem__
__setitem__
__delitem__
-
__getattr__
__setattr__
-
__getattribute__
只有在无法找到属性时才被调用
-