Python子类化和父值赋值

时间:2016-03-11 02:48:05

标签: python class flask

如果主题准确无误,我不知道该怎么说。

我正在学习使用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)

3 个答案:

答案 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_varsVAR1VAR2设置为要调用的类中的类变量。父类没有变化。

答案 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的值也发生了变化。这是我做的不同之处:

  • 构造函数 - 我为Config和Production类创建了构造函数,这允许我初始化和访问里面的变量。要定义类变量,您需要使用self关键字来表明这一点,因此我在您的脚本中对其进行了更改。
  • 功能 - 要更改VAR2的值,您需要包含可以执行此操作的功能。问题是,只需在Production类中为VAR1赋值,就不会执行任何操作,因为条件语句是Config类的一部分。 Config类中的条件语句是从不调用。为了有效地调用它,您可以将它放在方法(assign_var2)中,然后在Production类的构造函数中调用该方法。最后,为了进行健全性检查,我添加了print(self.VAR2)以确保代码正常运行。