【发布时间】:2020-11-06 07:45:03
【问题描述】:
我有一个问题:为什么我需要在元类中调用 super().--init--()?因为元类是类的工厂,我认为我们不需要调用初始化来制作类 Shop 的对象。或者使用 super().--init-- 我们初始化类? (因为我的 IDE 说,我应该调用它。但是没有 super().--init-- 什么也没有发生,我的班级工作没有错误)。 你能给我解释一下,为什么? 提前致谢!
class Descriptor:
_counter = 0
def __init__(self):
self.attr_name = f'Descriptor attr#{Descriptor._counter}'
Descriptor._counter += 1
def __get__(self, instance, owner):
return self if instance is None else instance.__dict__[self.attr_name]
def __set__(self, instance, value):
if value > 0:
instance.__dict__[self.attr_name] = value
else:
msg = 'Value must be > 0!'
raise AttributeError(msg)
class Shop():
weight = Descriptor()
price = Descriptor()
def __init__(self, name, price, weight):
self.name = name
self.price = price
self.weight = weight
def __repr__(self):
return f'{self.name}: price - {self.price} weight - {self.weight}'
def buy(self):
return self.price * self.weight
class Meta(type):
def __init__(cls, name, bases, attr_dict):
super().__init__(name, bases, attr_dict) # <- this is that func. call
for key, value in attr_dict.items():
if isinstance(value, Descriptor): # Here I rename attributes name of descriptor`s object.
value.attr_name = key
@classmethod
def __prepare__(metacls, name, bases):
return OrderedDict()
【问题讨论】:
标签: metaprogramming python-3.7 metaclass descriptor