python魔术方法学习笔记记录

python魔术方法

参考链接:https://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html#id13

一、构造方法

__new__:创建类实例

0)触发时机::创建类对象

1)使用方法:

def __new__(cls, *args, **kargs):
    # do something
    return super.__new__(cls, *args, **kargs) # 调用父类的__new__方法返回实例对象
  • cls:类本身

  • *args:位置传参,参数存为LIST类型

  • **kargs:关键字传参,参数存为DICT类型

  • return:创建的实例对象

**2)作用:**开辟内存空间,实例化类对象

3)使用场景:

  • 单例模式
  • 工厂模式Factory
  • 继承不可变类型

4)其他创建类对象时,先执行__new__方法,再执行__init__方法

__init__:初始化函数

0)触发时机::创建类对象

1)使用方法:

def __init__(self, *args, **kargs):
    self.name = "petty"
  • self:实例对象
  • *args:位置传参,参数存为LIST类型
  • **kargs:关键字传参,参数存为DICT类型
  • return:无返回值

**2)作用:**为类对象成员赋值

__del__:对象销毁器

0)触发时机::当对象执行垃圾回收操作时

1)使用方法:

def __del__(self):
    pass
  • self:实例对象
  • return:无返回值

**2)作用:**在销毁对象时关闭资源

使用实例:文件的打开与关闭

from os.path import join
class FileObject:
    def __init__(self, path, filename):
        self.f = open(join(path,filename),'r+')
    
    def __del__(self):
        self.f.close()
        del self.f

二、操作符方法

1、比较操作符

表格总结
方法作用
__cmp__(self, other)比较方法里面最基本的的魔法方法
__eq__(self, other)定义相等符号的行为,==
__ne__(self,other)定义不等符号的行为,!=
__lt__(self,other)定义小于符号的行为,<
__gt__(self,other)定义大于符号的行为,>
__le__(self,other)定义小于等于符号的行为,<=
__ge__(self,other)定义大于等于符号的行为,>=
缩写表示
  • __camp__
  • __eq__:equal(=)
  • __ne__:not equal(!=)
  • __lt__:less than(<)
  • __gt__:greater than(>)
  • __le__:less and equal(<=)
  • __ge__:greater and equal(>=)
使用实例:单词的长度比较
class Word(str):
    '''单词类,按照单词长度来定义比较行为'''

    def __new__(cls, word):
        # 注意,我们只能使用 __new__ ,因为str是不可变类型
        # 所以我们必须提前初始化它(在实例创建时)
        if ' ' in word:
            print("Value contains spaces. Truncating to first space.")
            word = word[:word.index(' ')]
            # Word现在包含第一个空格前的所有字母
        return str.__new__(cls, word)

    def __gt__(self, other):
        return len(self) > len(other)
    def __lt__(self, other):
        return len(self) < len(other)
    def __ge__(self, other):
        return len(self) >= len(other)
    def __le__(self, other):
        return len(self) <= len(other)

if __name__ == "__main__":
    print(Word('foo') < Word('bars'))

2、数值操作符

单目运算符和函数
方法作用
__pos__(self)实现一个取正数的操作
__neg__(self)实现一个取负数的操作
__abs__(self)实现一个内建的 abs() 函数的行为
__invert__(self)实现一个取反操作符(~操作符)的行为
__round__(self, n)实现一个内建的 round() 函数的行为
__floor__(self)实现 math.floor() 的函数行为
__ceil__(self)实现 math.ceil() 的函数行为
__trunc__(self)实现 math.trunc() 的函数行为
双目运算符或函数
方法作用
__add__(self, other)实现一个加法
__sub__(self, other)实现一个减法
__mul__(self, other)实现一个乘法
__floordiv__(self, other)实现一个 // 操作符产生的整除操作
__div__(self, other)实现一个 / 操作符代表的除法操作
__truediv__(self, other)实现真实除法
__mod__(self, other)实现一个 % 操作符代表的取模操作
__divmod__(self, other)实现一个内建函数 divmod()
__pow__(self, other)实现一个指数操作( ****** 操作符)的行为
__lshift__(self, other)实现一个位左移操作**(<<)**的功能
__rshift__(self, other)实现一个位右移操作**(>>)**的功能
__and__(self, other)实现一个按位进行与操作**(&)**的行为
__or__(self, other)实现一个按位进行或操作的行为
__xor__(self, other)异或运算符相当于 ^
增量运算
方法作用
__iadd__(self, other)加法赋值
__isub__(self, other)减法赋值
__imul__(self, other)乘法赋值
__ifloordiv__(self, other)整除赋值,地板除,相当于 //= 运算符
__idiv__(self, other)除法赋值,相当于 /= 运算符
__itruediv__(self, other)真除赋值
__imod_(self, other)模赋值,相当于 %= 运算符
__ipow__(self, other)乘方赋值,相当于 **= 运算符
__ilshift__(self, other)左移赋值,相当于 <<= 运算符
__irshift__(self, other)左移赋值,相当于 >>= 运算符
__iand__(self, other)与赋值,相当于 &= 运算符
__ior__(self, other)或赋值
__ixor__(self, other)异或运算符,相当于 ^= 运算符

三、类的表示

__str__:面向用户的表示

1)触发方式:调用str(d)或print(d)

>>>import datetime
>>>d = datetime.datetime.now()
>>>str(d)
'2023-02-23 16:06:50.966215'
>>>print(d)
2023-02-23 16:06:50.966215'

2)使用实例

class Student(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "name:%s" % self.name

s = Student('Petty')
print(s)
print(str(s))
print(repr(s))

--------------------运行结果----------------
name:Petty
name:Petty
<__main__.Student object at 0x00000120A21C5910>

__repr_:面向开发者的表示

1)触发方式:调用repr(d)或者直接输出对象d【交互模式下】,以及当类对象没有定义__str__方法并执行print(d)语句时

>>>import datetime
>>>d = datetime.datetime.now()
>>>repr(d)
'datetime.datetime(2023, 2, 23, 16, 6, 50, 966215)'
>>>d
'datetime.datetime(2023, 2, 23, 16, 6, 50, 966215)'

2)使用实例

class Student(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "姓名:%s" % self.name

s = Student('Petty')
print(s)
print(str(s))
print(repr(s))
--------------运行结果------------
姓名:Petty
姓名:Petty
姓名:Petty

__dir__:类的属性和方法名

1)作用:返回类的所有属性和方法名,是字典类型,dir()即调用该属性

2)实例:

class Student:
    name = "petty"
    age = 18
    def __init__(self): pass
    def hello(self): pass
    def goodbye(self): pass
 
s = Student()
s.__dir__()

四、访问控制attr

__getattr__:获取对象属性

1)触发时机:获取对象属性时,进行的操作

2)使用方法:

def __getattr__(self, name, default):
    # do something
    return super.__getattr__(self, name, default) # 调用父类的__getattr__方法返回实例对象
  • self:实例对象
  • name:实例属性名
  • default:当该属性不存在时的默认值

__setattr__:设置对象属性

1)触发时机:设置对象属性时,进行的操作

2)使用方法:

def __setattr__(self, name, value):
    # do something
    return super.__getattr__(self, name, value) # 调用父类的__setattr__方法返回实例对象
  • self:实例对象
  • name:实例属性名
  • value:设置值

__delattr__:删除对象属性

1)触发时机:销毁对象的属性时,进行的操作

2)使用方法:

def __delattr__(self, name):
    # do something
    return super.__delattr__(self, name) # 调用父类的__delattr__方法返回实例对象
  • self:实例对象

  • name:实例属性名

五、自定义序列[列表]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值