python魔法方法


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所有的魔法方法汇总

>

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值