2012-02-06 122 views
5

有没有办法完成这样的事情?我在Python的工作,但我不知道是否有办法做到这一点在任何编程语言...继承类属性(python)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

我知道我不能直接调用__class__。它只是一个例子,因为我想要类似于对类本身的引用,因为我希望子类根据其class_attribute采取不同的行为。

然后应该输出应该是这样的:

> Parent.class_method() 
"parent" 
> Child.class_method() 
"child" 

我知道同样的技术可以通过实例来完成。但我不想创建实例,因为有时__init__方法中的代码可能会很长并且要求很高,如果我经常想要调用class_method,我将不得不创建大量仅用于此一方法调用的实例。并且因为class_attributeclass_method是静态的,不会被实例更改。

+0

你只是在谈论'静态'功能? – Tigran 2012-02-06 20:09:17

回答

9

呃,听起来像是你想有一个类方法,这并不奇怪与classmethod装饰完成:

class Parent(object): 
    class_attribute = "parent" 

    @classmethod 
    def class_method(cls): 
     print cls.class_attribute 

class Child(Parent): 
    class_attribute = "child" 


>>> Parent.class_method() 
parent 
>>> Child.class_method() 
child 

或者,正如bgporter指出的那样,你可以直接使用属性来完成,而不需要任何方法。

+0

是的,这正是我想要的,非常感谢! – davekr 2012-02-06 20:16:55

+0

但考虑到文档:“如果为派生类调用类方法,那么**派生类对象**作为隐含的第一个参数传递”,这是否意味着派生类对象将以任何方式创建?因为OP说要避免实例构造。 – Tigran 2012-02-06 20:24:13

+0

我想调用方法,因为方法中的代码实际上可能会做更复杂的事情,然后只是打印属性。我虽然做一个更简单的exmaple会让我更容易解释我想要的......所以@classmethod是一个解决方案 – davekr 2012-02-06 20:24:56

3

这只是工作在Python,有或没有创建实例:

>>> class Parent(object): 
... attribute = "parent" 
... 
>>> class Child(Parent): 
... attribute = "child" 
... 
>>> p = Parent() 
>>> p.attribute 
'parent' 
>>> c = Child() 
>>> c.attribute 
'child' 
>>> Parent.attribute 
'parent' 
>>> Child.attribute 
'child' 
>>>