英文:
how to set class attribute only if it is created during init
问题
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
的实例,它具有属性 A
和 B
。现在我只想在它们在 __init__
中创建时才为它们分配值。也就是说,如果我设置 x.A=0
,它会起作用,但当我想为一个新属性 x.C=False
分配值时,它不应执行任何操作。
英文:
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
As shown above, I've created an instance of Boo
with attributes A
and B
. Now I'd like to assign value to attributes only if they are created during __init__
. i.e. if I set x.A=0
it will work, but when I want to set value to a new attribute x.C=False
it should do nothing.
答案1
得分: 1
Sure, here is the translated code part:
不完全是你所询问的,但你可能想要使用__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.A
和 x.B
的值(即使它们没有在 __init__
中创建),但任何尝试创建新属性,比如 x.C
,将导致 AttributeError
。
英文:
Not quite what you are asking, but you probably want to use __slots__
to control which attributes can be created, then ensure that they are initialized in __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()
You can continue to modify the values of x.A
and x.B
elsewhere in the code (even if not created in __init__
), but any attempt to create a new attribute like x.C
will result in an AttributeError
.
答案2
得分: -2
你可以尝试覆盖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 # 或者在找不到实例的情况下执行任何操作
英文:
You may try to override __setattr__()
function of Boo
class, and then you can set a condition to using hasattr()
built-in function to check if the instance is already present with the given name or not, if it is present set the value otherwise do nothing, here is the code that may help you;
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论