2016-09-29 46 views
0

在Python中,定义一个类时,可以在新的属性定义中使用之前定义的属性,而无需进一步参考。Python:如何在类级别访问超级属性属性定义

class Parent(object): 
    a_value = 'a' 
    another_value = 'b' 
    all_values = (a_value, another_value) 

是否有可能在派生类中做同样的事情,但仍然可以访问这些父属性中的一些?

我试图做这样的事情:

class Child(Parent): 
    a_child_value = 'c' 
    all_values = (a_value, another_value, a_child_value) 

但它似乎并没有考虑到父母继承和给了我以下错误:

NameError: name 'a_value' is not defined 

那么,有没有任何方式来表明a_valueanother_value应该从父类而不是当前上下文?

在我的情况下,特别是值不是字符串,而是预编译的正则表达式,所以我想避免每次创建新实例时都必须在__init__方法内创建它们。

+0

@Moses Koledoye:我不会认为这是重复的:虽然你所指出的问题含蓄地包含了我正在寻找的信息,但所要求的信息是不同的。我问了“怎么做”,因为我无法在任何地方找到它,而这个问题就是以这种方式问“为什么”。 –

+0

愚蠢的目标不仅仅是回答你的问题。它更详细地描述你想要什么;为什么和如何。问题不一定要完全一样。 –

回答

1

您需要做Parent.a_value才能获得您之后的值。 a_child是一个静态属性,因此附加到类本身而不是局部变量。

class Child(Parent): 
    a_child_value = 'c' 
    all_values = (Parent.a_value, Parent.another_value, a_child_value) 

如果它是从某个东西派生出来的,那么您必须输入它从中派生出来的东西。

+0

恐怕这不是一个有效的解决方案,因为'Child'还没有完全定义,它不存在作为有效的参考。你可以尝试自己(这,顺便说一句,你应该总是在回答任何问题之前做),并看到它引发了以下内容:'NameError:名称'儿童'未定义' –

+0

是的,你是正确的,我非常用于抽象而不是静态的,并且会像那样工作。我确实测试过,但我只是快速地将X作为父母,Y作为孩子,只检查我是否可以从IDE获得“一个”属性(即X)“>>>”thing(don不知道那条线的正确名字)。 – Frogboxe

1

这样子。

class Child(Parent): 

    a_child_value = 'c' 

    all_values = (Parent.a_value, Parent.another_value, a_child_value) 
+0

是的,这更像它。 –

+0

如果您从对象类型类创建父对象。还有另一种方式来处理它。这会更有意义。 – Howardyan

+0

你能解释一下“从对象创建父对象”是什么意思?另外,如果它更有意义,为什么你不在回答中使用它,而不是那些不是? –