python-3.x 如何仅在init [duplicate]期间创建类属性时设置类属性

xmd2e60i  于 2023-04-13  发布在  Python
关注(0)|答案(2)|浏览(118)

此问题已在此处有答案

Prevent creating new attributes outside init(13个回答)
关闭2天前.

class Foo:
    def __init__(self):
        self.A = 100

class Boo(Foo):
    def __init__(self):
        super(Boo, self).__init__()
        self.B = None

x = Boo()
print(x.A, x.B)

# 100 None

如上所示,我已经创建了一个Boo的示例,它的属性为AB。现在我只想在__init__期间创建属性时才给它们赋值。也就是说,如果我设置x.A=0,它就可以工作,但是当我想给一个新的属性x.C=False设置值时,它应该什么都不做。

slwdgvem

slwdgvem1#

这与您的要求不完全相同,但您可能希望使用__slots__来控制可以创建哪些属性,然后确保在__init__中初始化它们。

class Foo:
    __slots__ = ('A',)

    def __init__(self):
        self.A = 100

class Boo(Foo):
    __slots__ = ('B',)

    def __init__(self):
        super().__init__()
        self.B = None

x = Boo()

您可以继续在代码的其他地方修改x.Ax.B的值(即使不是在__init__中创建的),但是任何创建新属性(如x.C)的尝试都将导致AttributeError

bkhjykvo

bkhjykvo2#

你可以尝试重写Boo类的__setattr__()函数,然后你可以设置一个条件,使用hasattr()内置函数来检查示例是否已经存在给定的名称,如果存在,则设置值,否则不做任何事情,下面是可能对你有帮助的代码;

class Boo(Foo):
    def __init__(self):
        super(Boo, self).__init__()
        self.B = None
    def __setattr__(self, name, value):
        if hasattr(self, name):
            super().__setattr__(name, value)
        else:
            pass # or anything yo want to do in case instance not found

相关问题