Python重写元类集属性
假设我有一门课:Python重写元类集属性,python,class,overriding,Python,Class,Overriding,假设我有一门课: class ABC: pass 我确实: ABC.x = 123 这不会给我一个错误,即使我还没有创建对象。正在调用哪个\uuuuu func\uuuuu方法,以及如何重写它?您需要定义一个元类并在那里重写\uuuuuu setattr\uuuu,然后让您的类使用该元类 class Meta(type): def __new__(meta, name, bases, attrs): return super().__new__(meta, n
class ABC:
pass
我确实:
ABC.x = 123
这不会给我一个错误,即使我还没有创建对象。正在调用哪个
\uuuuu func\uuuuu
方法,以及如何重写它?您需要定义一个元类并在那里重写\uuuuuu setattr\uuuu
,然后让您的类使用该元类
class Meta(type):
def __new__(meta, name, bases, attrs):
return super().__new__(meta, name, bases, attrs)
def __setattr__(cls, attr, value):
print("I am setting {}.{} = {}".format(cls.__name__, attr, value))
return super().__setattr__(attr, value)
class Foo(metaclass=Meta):
pass
然后:
您需要定义一个元类并覆盖那里的
\uuuu setattr\uuuu
,然后让您的类使用该元类
class Meta(type):
def __new__(meta, name, bases, attrs):
return super().__new__(meta, name, bases, attrs)
def __setattr__(cls, attr, value):
print("I am setting {}.{} = {}".format(cls.__name__, attr, value))
return super().__setattr__(attr, value)
class Foo(metaclass=Meta):
pass
然后:
您正在设置类对象的属性。因此调用了
\uuuu setattr\uuuu
,但它是在元类上调用的。查阅元类,了解你的用意。@BrenBarn谢谢你的建议,我很快就会这么做。然而,为了解决我眼前的问题,你介意提交一个答案吗?:)您使用的是Python 2还是Python 3?@BrenBarn Python3您正在设置类对象的属性。因此调用了\uuuu setattr\uuuu
,但它是在元类上调用的。查阅元类,了解你的用意。@BrenBarn谢谢你的建议,我很快就会这么做。然而,为了解决我眼前的问题,你介意提交一个答案吗?:)您使用的是Python 2还是Python 3?@BrenBarn Python3