编程语言
首页 > 编程语言> > python的魔术方法

python的魔术方法

作者:互联网

迭代器

如果一个类包含了__iter__方法,而且该方法返回了一个包含__next__方法的对象,即为迭代器

# 示例1,返回一个迭代对象
class A:
    def __iter__(self):
        return list('abcd').__iter__()

# 示例2 自身可迭代
class A:
    def __iter__(self):
        self.data = list('abcd')
        return self

    def __next__(self):
        # 注意
        try:
            return self.data.pop(0)
        except IndexError:
            raise StopIteration
# 扩展,利用生成器快速实现元素迭代访问,缺点是调用需要A().travel()
class A:
    def travel(self):
        for i in list('abcd'):
            yield i

比较运算符与计算运算符

通过实现运算符,可以实现开起来比较直观的程序

参见:https://docs.python.org/zh-cn/3/library/operator.html#module-operator

'''
 -  __lt__() <
 - __le__() <= 
 - __gt__() >
 -  __ge__() >=
 - __eq__() =
 - ...
'''

描述器,用令一个类来管理当前类属性

注意:实例查找通过命名空间链进行扫描,数据描述器的优先级最高,其次是实例变量、非数据描述器、类变量,最后是 getattr() (如果存在的话)。
区分 getattr、setattr 与 描述器

动态属性

import os

class DirectorySize:

    def __get__(self, obj, objtype=None):  # 计算文件夹中文件的数量
        return len(os.listdir(obj.dirname))

class Directory:

    size = DirectorySize()              # 访问该属性,即可获得文件夹中文件的数量

    def __init__(self, dirname):
        self.dirname = dirname          # Regular instance attribute

属性托管

通过属性托管,实现一些附加功能,比如属性访问日志或者属性校验等

class Number:
    def __set_name__(self, owner, name): # 在Person中定义属性时调用,定义了一个私有名字
        self.private_name = '_' + name

    def __get__(self, obj, objtype=None):  # 在Person对象调用age时调用
        return getattr(obj, self.private_name)

    def __set__(self, obj, value):  # 在Person对象为age赋值时调用,验证赋值属性
        self.validate(value)
        setattr(obj, self.private_name, value)

    def validate(self, value):
        if not isinstance(value, (int, float)):
            raise TypeError(f'Expected {value!r} to be an int or float')

class Person:
    age = Number()

    def __init__(self, age):
        self.age = age

标签:__,obj,name,python,self,魔术,方法,class,def
来源: https://blog.csdn.net/liunan591/article/details/122647548