在__init__方法的exec函数内创建的Python类私有属性将成为公共属性而不是私有属性[重复]

nwlqm0z1  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(108)
    • 此问题在此处已有答案**:

python How to create private class variables using setattr or exec?(3个答案)
3天前关闭。
我正在尝试创建一个类Customer,它从sqlalchemy查询对象创建它的属性。

data = {'Name':'John Doe','Age':67} #in the real code , data is a not a dictionary but an object. 

class Customer:
   
    def __init__(self,data) -> None:
        assert type(data) == Customers
        for key in data.keys():
            exec(f"self.__{key[1:] if key.startswith('_') else key} = data['{key}']",{'self':self,'data':data})
    
    @property
    def name(self):
        return self.__Name
data['bank'] = green
person = Customer(data)

我能够将Customer属性作为公共属性进行访问:
print(person.__Name)它会输出John Doe
但是当我尝试通过name方法访问该属性时,如下所示:print(person.name)它会引发错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\HP\PyProject\FlaskProject\green\bank\modelx.py", line 66, in name
    return self.__Name
AttributeError: 'Customer' object has no attribute '_Customer__Name'

如何使exec函数中创建的类属性作为类的私有属性而不是公共属性。

jyztefdp

jyztefdp1#

这里不需要exec。使用setattr

for key in data:
    setattr(self, key[1:] if key.startswith('_') else key, data[key])

此外,请使用isinstance,而不要使用类型比较。

assert isinstance(data, Customers)

尽管在您示例中,data * 不是 * Customers的示例;它是传递给Customer.__init__的普通dict

相关问题