首页 > 其他分享 > 描述符,元类,魔术方法之间的关系和区别

描述符,元类,魔术方法之间的关系和区别

时间:2023-07-29 10:35:04浏览次数:31  
标签:__ name self value 元类 魔术 描述符 方法 def

描述符(Descriptor)、元类(Metaclass)和魔术方法(Magic methods)是Python中三个不同的概念,它们在不同的层次上提供了不同的功能和行为。

  1. 描述符(Descriptor): 描述符是一种实现了特定协议的对象,它可以被用作类的属性,控制对属性的访问和修改。描述符通常定义了__get____set____delete__等方法,用于控制属性的获取、设置和删除操作。描述符可以用来实现属性的验证、计算、延迟加载等功能。
    例如,下面是一个简单的描述符示例,用于限制属性的取值范围:
class RangeValidator:
    def __init__(self, min_value, max_value):
        self.min_value = min_value
        self.max_value = max_value

    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if value < self.min_value or value > self.max_value:
            raise ValueError("超出范围")
        instance.__dict__[self.name] = value

    def __set_name__(self, owner, name):
        self.name = name

class MyClass:
    attr = RangeValidator(0, 100)

obj = MyClass()
obj.attr = 50
print(obj.attr)  # 输出: 50
obj.attr = 200  # 抛出 ValueError 异常

在上面的示例中,RangeValidator是一个描述符类,它通过__get____set__方法控制了属性的获取和设置操作。MyClass类中的attr属性使用了RangeValidator描述符,从而限制了属性的取值范围。

  1. 元类(Metaclass): 元类是用于创建类的类,它控制了类的创建过程。元类可以通过定义__new____init__等方法来自定义类的创建行为。元类可以用来修改类的属性、方法、继承关系等。
    例如,下面是一个简单的元类示例,用于自动给类的方法添加日志记录功能:
class LogMeta(type):
    def __new__(cls, name, bases, attrs):
        for attr_name, attr_value in attrs.items():
            if callable(attr_value):
                attrs[attr_name] = cls.log_wrapper(attr_value)
        return super().__new__(cls, name, bases, attrs)

    @staticmethod
    def log_wrapper(func):
        def wrapper(*args, **kwargs):
            print(f"调用了方法 {func.__name__}")
            return func(*args, **kwargs)
        return wrapper

class MyClass(metaclass=LogMeta):
    def method1(self):
        print("执行方法1")

    def method2(self):
        print("执行方法2")

obj = MyClass()
obj.method1()  # 输出: 调用了方法 method1\n执行方法1
obj.method2()  # 输出: 调用了方法 method2\n执行方法2

在上面的示例中,LogMeta是一个元类,通过定义__new__方法,它在创建MyClass类时会自动给类的方法添加日志记录的功能。

  1. 魔术方法(Magic methods): 魔术方法是Python中特殊命名的方法,以双下划线开头和结尾(例如__init____str__等)。它们用于在特定的情况下自动调用,以实现特定的功能或行为。魔术方法可以用于自定义类的实例化、比较、运算符重载等。
    例如,下面是一个简单的魔术方法示例,用于自定义类的比较行为:
class MyClass:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

obj1 = MyClass(10)
obj2 = MyClass(10)
obj3 = MyClass(20)

print(obj1 == obj2)  # 输出: True
print(obj1 == obj3)  # 输出: False

在上面的示例中,__eq__是一个魔术方法,它定义了类的相等比较行为。通过重载__eq__方法,我们可以自定义类对象之间的比较操作。

总结: 描述符、元类和魔术方法是Python中不同层次的概念。描述符用于控制属性的访问和修改,元类用于控制类的创建过程,魔术方法用于自定义类的行为和功能。它们各自提供了不同的功能和扩展性,可以用于实现各种高级的编程技巧和模式。

标签:__,name,self,value,元类,魔术,描述符,方法,def
From: https://blog.51cto.com/u_16055028/6890714

相关文章

  • 什么时候使用魔术方法,什么时候使用元类,什么时候使用描述符,什么时候使用装饰器, 什
    当你需要在类的实例化、属性访问或方法调用等特定时机执行特定的操作时,可以使用魔术方法。例如,假设你正在编写一个表示矩形的类,并希望在创建矩形对象时自动计算其面积。你可以使用__init__魔术方法来初始化矩形的属性,并在其中计算面积。classRectangle:def__init__(self,wi......
  • 文件描述符终极使用
    0x01文件描述符介绍Linux系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。这个操作包含各种文件的读写,程序......
  • php魔术常量
    PHP向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。 1、__LINE__文件中的当前行号。 2、__FI......
  • Python【11】__getitem__ 魔术方法
    让方法能使用[key]返回值或做操作参考(侵删):https://blog.csdn.net/Norsaa/article/details/105564931......
  • python魔术方法模拟篇
    6,模拟篇__call____len____length_hint____getitem____setitem____delitem____reversed____contains____iter____missing____enter__和__exit____call__方法所谓的callable就是可以以函数调用的形式来使用的对象,那想让一个类的对象成为callable,我们需要给它定义这个......
  • python魔术方法类构建篇
    本篇章的很多魔术方法都是跟class的建立有关的4,类构建篇__init_subclass____set_name____class_getitem__和__mro_entries____prepare____instancecheck__和__subclasscheck__ __init_subclass__方法__init_subclass__这个方法你要定义在基类里面,然后当你以这个类为基......
  • python魔术方法属性篇
    python魔术方法属性篇本篇章主要讲与对象的属性有关的魔术方法3,属性篇__getattr____getattribute____setattr____delattr____dir____get____set____delete____slots__ __getattr__方法每当我们写形如这种o.test的代码的时候,我们实际上都是在尝试access这个对象......
  • python魔术方法大全 基础篇、比较篇
    魔术方法大全魔术方法官方名称叫specialmethod,所谓的魔术方法就是python让用户客制化一个类的方式,顾名思义就是定义在类里面的一些特殊的方法。这些specialmethod的特点就是它的method的名字,前后都有两个下划线,所以这些方法也被称为Dundermethod。基础篇比较篇属性篇类......
  • 了不起的魔术师问题
    目录了不起的魔术师问题前言问题描述解决方案参考了不起的魔术师问题前言此问题来自于<<Python编程:从入门到实践>>第一版中习题8-10.问题描述了不起的魔术师:创建一个包含魔术师名字的列表,并将其传递给一个名为show_magicians()的函数,这个函数打印列表中每个魔术......
  • python魔术方法之__new__
    一、基本用法#从一个类建立一个对象#__new__从class建立一个object过程#__init__有了object初始化过程classLanguage:def__new__(cls,*args,**kwargs):print("__new__")returnsuper().__new__(cls)def__init__(self):print(......