title: python魔法方法
top: 43
date: 2022-07-06 14:51:48
tags:
- magicMethod
categories: - python
魔术方法 | 描述 |
---|---|
new | 创建类并返回这个类的实例 |
init | 可理解为“构造函数”,在对象初始化的时候调用,使用传入的参数初始化该实例 |
del | 可理解为“析构函数”,当一个对象进行垃圾回收时调用 |
metaclass | 定义当前类的元类 |
class | 查看对象所属的类 |
base | 获取当前类的父类 |
bases | 获取当前类的所有父类 |
str | 定义当前类的实例的文本显示内容 |
getattribute | 定义属性被访问时的行为 |
getattr | 定义试图访问一个不存在的属性时的行为 |
setattr | 定义对属性进行赋值和修改操作时的行为 |
delattr | 定义删除属性时的行为 |
copy | 定义对类的实例调用 copy.copy() 获得对象的一个浅拷贝时所产生的行为 |
deepcopy | 定义对类的实例调用 copy.deepcopy() 获得对象的一个深拷贝时所产生的行为 |
魔术方法 | 描述 |
---|---|
eq | 定义相等符号“==”的行为 |
ne | 定义不等符号“!=”的行为 |
lt | 定义小于符号“<”的行为 |
gt | 定义大于符号“>”的行为 |
le | 定义小于等于符号“<=”的行为 |
ge | 定义大于等于符号“>=”的行为 |
add | 实现操作符“+”表示的加法 |
sub | 实现操作符“-”表示的减法 |
mul | 实现操作符“*”表示的乘法 |
div | 实现操作符“/”表示的除法 |
mod | 实现操作符“%”表示的取模(求余数) |
pow | 实现操作符“**”表示的指数操作 |
and | 实现按位与操作 |
or | 实现按位或操作 |
xor | 实现按位异或操作 |
len | 用于自定义容器类型,表示容器的长度 |
getitem | 用于自定义容器类型,定义当某一项被访问时,使用 self[key] 所产生的行为 |
setitem | 用于自定义容器类型,定义执行 self[key]=value 时产生的行为 |
delitem | 用于自定义容器类型,定义一个项目被删除时的行为 |
iter | 用于自定义容器类型,一个容器迭代器 |
reversed | 用于自定义容器类型,定义当 reversed( ) 被调用时的行为 |
contains | 用于自定义容器类型,定义调用 in 和 not in 来测试成员是否存在的时候所产生的行为 |
missing | 用于自定义容器类型,定义在容器中找不到 key 时触发的行为 |
abs | 取绝对值abs() |
class Vector:
a = None
b = None
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return '向量(%d, %d)' % (self.a, self.b)
def __add__ (self, other):
return Vector(self.a + other.a, self.b + other.b)
def __sub__(self, other):
return Vector(self.a - other.a, self.b - other.b)
v1 = Vector(1, 2)
v2 = Vector(3, 4 )
print(v1, " + ", v2, "=", v1 + v2)
print(v1, " - ", v2, "=", v1 - v2)
"""output
class Vector:
... a = None
... b = None
... def __init__(self, a, b):
... self.a = a
... self.b = b
... def __str__(self):
... return '向量(%d, %d)' % (self.a, self.b)
... def __add__ (self, other):
... return Vector(self.a + other.a, self.b + other.b)
... def __sub__(self, other):
... return Vector(self.a - other.a, self.b - other.b)
>>> v1 = Vector(1, 2)
>>> v2 = Vector(3, 4 )
>>> print(v1, " + ", v2, "=", v1 + v2)
向量(1, 2) + 向量(3, 4) = 向量(4, 6)
>>> print(v1, " - ", v2, "=", v1 - v2)
向量(1, 2) - 向量(3, 4) = 向量(-2, -2)
"""
"""类的魔法方法和成员方法
package >> pymagic
"""
class Cat:
"""cat类"""
def __init__(self, age=None):
self.name = 'Cname'
self.__private = 'private' # 私有变量,无法直接访问。可使用cat._Cat__private强制访问
self.age = age
def __del__(self):
print('我在del cat或程序结束时会执行,即变量被回收时执行')
def __call__(self, *args, **kwargs):
print("cat: ", args, kwargs, "你可以用类似函数调用的方法调用Cat类,如cat(a,b,c)")
def __str__(self): # 改变类输出的形式
return '我是:' + self.name
def __int__(self):
...
def __float__(self):
...
def __new__(cls, *args, **kwargs):
"""
1.在一个对象实例化的时候调用的第一个方法
2.cls代表类的名称,表示该类,其他的参数是用来直接传递给__init__方法
3.决定是否要用__init__方法。可以调用其他的构造方法或直接返回别的实例对象作为本类的实例。如果没有返回实例对象,则__init__不会被调用
4.用于继承一个不可变的类型,比如tuple或string
"""
if len(args) and args[0]>50:
print("the cat is died.")
else:
return object.__new__(cls)
def __len__(self):
...
def __iter__(self):
return iter(self.name)
def __getitem__(self, item):
if self.name != item:
return self.name
def __setitem__(self, key, value):
if self.name != key:
self.name = value
def __delitem__(self, key):
if key == 'name':
del self.name
print('delitem操作')
def __add__(self, other):
...
def __sub__(self, other):
...
def __mul__(self, other):
...
def __truediv__(self, other):
...
def __floordiv__(self, other):
...
def __mod__(self, other):
...
def __pow__(self, power, modulo=None):
...
if __name__ == '__main__':
cat = Cat()
# 成员方法
print(cat.__dict__) # 类的成员变量字典
print(cat.__doc__) # 类的描述信息
print(cat.__module__) # 模块名称
print(cat.__dir__()) # 列出对象的所有属性(方法)名
obj = object()
print(obj.__dir__())
"""测试魔法方法好成员方法功能
"""
import pymagic as pm
dcat = pm.Cat(60)
print(dcat)
print('###############split##############')
cat = pm.Cat(10)
print(cat.__new__.__doc__)
print(cat._Cat__private)
# 成员方法
print(cat.__dict__)
print(cat.__doc__)
print(cat.__module__)
print('###############split##############')
# 魔法方法
# __call__
cat('meow', 'moew')
# __str__
print(cat)
# __iter__
for i in cat:
print('iter:', i)
# __getitem__ __setitem__ __delitem__ 让类支持[]形式的操作
print('getitem', cat['dog'])
cat['dog'] = 'dog'
print(cat.name)
# 运算符重载 + __add__ | - __sub__ | * __mul__ | / __truediv__ | // __floordiv__ | % __mod__ | ** __pow__
del cat['name']
# __del__
"""print infos
the cat is died.
None
###############split##############
1.在一个对象实例化的时候调用的第一个方法
2.cls代表类的名称,表示该类,其他的参数是用来直接传递给__init__方法
3.决定是否要用__init__方法。可以调用其他的构造方法或直接返回别的实例对象作为本类的实例。如果没有返回实例对象,则__init__不会被调用
4.用于继承一个不可变的类型,比如tuple或string
private
{'name': 'Cname', '_Cat__private': 'private', 'age': 10}
cat类
base.pymagic
###############split##############
cat: ('meow', 'moew') {} 你可以用类似函数调用的方法调用Cat类,如cat(a,b,c)
我是:Cname
iter: C
iter: n
iter: a
iter: m
iter: e
getitem Cname
dog
delitem操作
我在del cat或程序结束时会执行,即变量被回收时执行
"""
参考链接
[1] Python高级核心技术97讲
[2] Python常用魔术方法一览表
[3] python所有的魔法方法汇总
>