简体   繁体   中英

Assign Python class variable with a method of that class

I have a code like this:

def my_func():
    pass

class MyClass():
   class_variable = my_func()
   pass

i = MyClass()

Since my_func is logically related to MyClass , and doesn't serve any purpose outside of it, I'd prefer to have something like that instead:

class MyClass():
   class_variable = my_func()

   def my_func():
       pass

i = MyClass()

The above doesn't work, of course, because my_func isn't defined yet at the time it's called. Is there some other way to assign a class variable from inside the class?

I'd personally keep my_func() outside the class . Sure, it may only be used for the class definition, but if it is not useful once the class is defined , it should not be part of the class API.

If the my_func() function should be used together with the class even after the class has been created, then you can still make this work with MyClass.my_func() being a static method. In that case define the function first before setting the class variable:

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

   class_variable = my_func.__func__()

The @staticmethod is not strictly necessary as at the time class_variable is set , my_func is still a local name in the class definition body.

However, since you are using it as as static function anyway, you may as well mark it as such. The advantage however is that MyClass.my_func() now also works.

Because a @staticmethod isn't going to bind outside of a class or instance attribute context, you do need to unwrap it first by accessing the wrapped function with the __func__ attribute.

Demo:

>>> class MyClass():
...    @staticmethod
...    def my_func():
...        return 'foobar'
...    class_variable = my_func.__func__()
... 
>>> MyClass.class_variable
'foobar'
>>> MyClass.my_func()
'foobar'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM