gpt4 book ai didi

python - 如何拦截类创建并使用元类添加属性?

转载 作者:太空狗 更新时间:2023-10-30 00:01:24 24 4
gpt4 key购买 nike

在下面的代码中,我希望元类 NameMeta 将属性 gender 添加到 MyName 类,以防此类未声明该属性。

class NameMeta(type):
def __new__(cls, name, bases, dic):
if 'gender' not in dic:
setattr(name, 'gender', 'Male')
return super().__new__(cls, name, bases, dic)

class MyName(metaclass=NameMeta):
def __init__(self, fname, lname):
self.fname = fname
self.lname = lname
def fullname(self):
self.full_name = self.fname + self.lname
return self.full_name
inst = MyName('Joseph ', 'Vincent')
print(MyName.gender)

这是我得到的输出:

<ipython-input-111-550ff3cfae41> in __new__(cls, name, bases, dic)
2 def __new__(cls, name, bases, dic):
3 if 'gender' not in dic:
----> 4 setattr(name, 'gender', 'Male')
5 return super().__new__(cls, name, bases, dic)
6

AttributeError: 'str' object has no attribute 'gender'

我知道这个错误是有道理的,因为 name 是一个字符串。我的问题是,如何将 MyName 类作为元类中的对象进行访问,以便添加属性?

最佳答案

你很接近。您的问题是您试图使用 name 将您的属性添加到 meta-class 的名称中,这是一个字符串。您需要将属性分配给您正在创建的类对象。这可以使用 dic 来完成:

class NameMeta(type):
def __new__(cls, name, bases, dic):
if 'gender' not in dic:
dic['gender'] = 'Male'
return super().__new__(cls, name, bases, dic)

通过以上改变你的代码输出:

Male

关于python - 如何拦截类创建并使用元类添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com