2011-02-09 2 views
0

Я хотел бы сделать что-то вдоль линий ...Как можно использовать методы класса объекта python внутри атрибутов класса?

class MyClassA(object): 
    an_attr = AnotherClassB(do_something=MyClassA.hello) 

    @classmethod 
    def hello(cls): 
     return "Hello" 

однако он расскажет мне MyClassA не определен, когда я пытаюсь запустить его.

  • an_attr должен быть атрибут класса
  • Я не могу изменить AnotherClassB
  • Я бы предпочел, если hello() оставался classmethod

Любые идеи?

ответ

3

Вы просто должны получить заказ прямо, так это определяется, прежде чем использовать его:

class MyClassA(object): 
    @classmethod 
    def hello(cls): 
     return "Hello" 

    an_attr = AnotherClassB(do_something=hello) 

Обратите внимание, что, потому что в пространстве имен, когда мы создаем класс, мы просто сослаться до hello, а не MyClassA.hello.

EDIT: Извините, на самом деле это не делает то, что я думал. Он создает класс без ошибки, но AnotherClassB получает ссылку на несвязанный метод класса, который нельзя вызвать.

+0

Отлично, я предпочитаю, чтобы это было в определении класса. –

+1

Это не будет работать как ожидается - по крайней мере, 'AnotherClassB' ничего не может сделать с помощью' hello', поскольку он не знает, какой класс должен пройти как параметр 'cls', поэтому это не кажется полезным вообще. –

+0

Мой плохой. Я предположил, что это связано с классом 'classmethod', но, похоже, связано с извлечением атрибута. Будет ли он работать для статического метода? –

3

При определении класса класс еще не существует. Таким образом, вы должны отложить создание an_attr только после определения класса:

class MyClassA(object): 
    @classmethod 
    def hello(cls): 
     return "Hello" 
MyClassA.an_attr = AnotherClassB(do_something=MyClassA.hello) 
+0

user387821 просто побил вас там там +1 в любом случае. –

+0

@StephenPaulger: Ну, я сначала отправил ответ, как вы можете легко увидеть, выбрав порядок сортировки «самый старый» выше. Не то, чтобы это имело значение в любом случае ... :) –

2

Я не уверен, если это будет работать, но попробовать его?

class MyClassA(object): 
    @classmethod 
    def hello(cls): 
     return "Hello" 

    MyClassA.an_attr = AnotherClassB(do_something=MyClassA.hello) 
+0

Я боялся, что ответ может быть что-то вроде этого :) Спасибо, это работает. –

Смежные вопросы