如果主题准确无误,我不知道该怎么说。
我正在学习使用Python课程。我创建了一个我希望能够子类化的类。问题是类的某些部分依赖于类中设置的变量,并且那些默认为空值(目的是在子类化时定义它们)。例如:
config.py:
class Config(object):
VAR1 = ''
if VAR1 == 'somevalue':
VAR2 = VAR1 + 'something'
else:
VAR2 = VAR1
subclass.py:
from config import Config
class Production(Config):
VAR1 = 'value1'
这里的问题是VAR2不会接收子类VAR1。我理解为什么这不能正常工作,我的问题是:是否可以这样做(或以类似的方式)?如果是这样,怎么样?
更新
我找到了解决这个问题的方法,但它仍然需要更多的输入,而不是我喜欢的 - 以下函数的变体是最小的,并且基于Config
时显式设置的变量子类。因此,根据子类的上下文(当Config
被子类化时的VAL1的值)自动设置这些值(来自父类的VAL2)会很好,而不必显式设置它们。
config.py:
class Config(object)
VAR1 = ''
VAR2 = ''
def set_var2(val):
if val == 'somevalue':
VAR2 = val + 'value2'
else:
VAR2 = 'value2'
return VAR2
subclass.py:
from config import Config, set_var2
class Production(Config):
VAR1 = 'value1'
VAR2 = set_var2(VAL1)
答案 0 :(得分:1)
我认为你想要的是访问一个属性(即obj.foo
)并让它执行最后一分钟的计算。这样,您可以评估在定义原始类之后可能发生的任何子类的结果。
这是@property
装饰器的用途 - 隐藏属性名称后面的代码。有关示例,请参阅this answer of mine。
答案 1 :(得分:0)
这是使用类方法执行此操作的方法。我本来希望将类方法调用放在类本身的顶层,但由于该类尚不存在,因此无法工作。因此,您需要在定义类之后调用类方法。但它确实有效。
这是Config
的示例定义(和配置):
class Config(object):
@classmethod
def set_vars(cls, var1):
cls.VAR1 = var1
if var1 == 'somevalue':
cls.VAR2 = var1 + 'something'
else:
cls.VAR2 = var1
Config.set_vars('')
以下是如何定义cond configure Production
:
class Production(Config):
pass
Production.set_vars('value1')
类方法set_vars
将VAR1
和VAR2
设置为要调用的类中的类变量。父类没有变化。
答案 2 :(得分:-1)
因为Python是一种面向对象的编程语言,所以你创建的类应该总是有构造函数。这些是初始化类内部变量的特殊方法,Python使用__init__()
方法来实现它。这是解决困境的方法。
class Config(object):
def __init__(self):
self.VAR1 = ''
self.VAR2 = ''
def assign_var2(self):
if self.VAR1 == 'somevalue':
self.VAR2 = self.VAR1 + 'something'
else:
self.VAR2 = self.VAR1
class Production(Config):
def __init__(self):
self.VAR1 = 'somevalue'
self.assign_var2()
print(self.VAR2)
Production()
此代码的输出为somevaluesomething
,这实际上表明通过为VAR1
分配值,VAR2
的值也发生了变化。这是我做的不同之处:
self
关键字来表明这一点,因此我在您的脚本中对其进行了更改。VAR2
的值,您需要包含可以执行此操作的功能。问题是,只需在Production类中为VAR1
赋值,就不会执行任何操作,因为条件语句是Config类的一部分。 Config类中的条件语句是从不调用。为了有效地调用它,您可以将它放在方法(assign_var2
)中,然后在Production类的构造函数中调用该方法。最后,为了进行健全性检查,我添加了print(self.VAR2)
以确保代码正常运行。