наследование по атрибутам класса (python) - PullRequest
6 голосов
/ 07 февраля 2012

Есть ли способ сделать что-то подобное?Я работаю в 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_attribute и class_method являются статическими и не будут изменены экземплярами.

Ответы [ 2 ]

9 голосов
/ 07 февраля 2012

Э-э, звучит так, как будто вы хотите метод класса, что неудивительно, если вы используете декоратор 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, вы можете сделать это напрямую с атрибутами, снет необходимости в методах вообще.

3 голосов
/ 07 февраля 2012

Это просто работает в 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'
>>> 
...