2014-08-30 2 views
0

У меня есть следующий код:Присвоить Python переменная класса с методом этого класса

def my_func(): 
    pass 

class MyClass(): 
    class_variable = my_func() 
    pass 

i = MyClass() 

Поскольку my_func логически связан с MyClass, и не служит никакой цели вне ее, я бы предпочел иметь что-то подобное, что вместо того, чтобы:

class MyClass(): 
    class_variable = my_func() 

    def my_func(): 
     pass 

i = MyClass() 

выше не работает, конечно, потому что my_func еще не определена в то время как это называется. Есть ли другой способ присвоить переменную класса внутри класса?

ответ

2

Я лично держать my_func() вне класса. Конечно, он может использоваться только для определения класса, но если он не полезен после определения класса, он не должен быть частью API класса.

Если функция my_func() должна использоваться вместе с классом даже после создания класса, то вы все равно можете сделать эту работу с MyClass.my_func() статическим методом. В этом случае определить функцию первого перед установкой переменного класса:

class MyClass(): 
    @staticmethod 
    def my_func(): 
     pass 

    class_variable = my_func.__func__() 

@staticmethod не является строго необходимым, как в то время class_variable устанавливается, my_func еще локальное имя в теле определения класса.

Однако, поскольку вы являетесь , используя это как статическая функция в любом случае, вы можете также отметить это как таковое. Преимущество состоит в том, что теперь работает и MyClass.my_func().

Поскольку @staticmethod не будет связываться вне контекста атрибута класса или экземпляра, вам необходимо сначала распаковать его, обратившись к завернутой функции с помощью атрибута __func__.

Демо:

>>> class MyClass(): 
... @staticmethod 
... def my_func(): 
...  return 'foobar' 
... class_variable = my_func.__func__() 
... 
>>> MyClass.class_variable 
'foobar' 
>>> MyClass.my_func() 
'foobar' 
Смежные вопросы