Как я могу использовать атрибут класса Python в качестве значения по умолчанию для @Classmethod? - PullRequest
0 голосов
/ 06 июня 2019

Посмотрите на код ниже.

Я хочу использовать значение a в качестве значения по умолчанию для аргумента c в объявлении метода класса my_method().

Как я могу это сделать? В приведенном ниже примере не удается.

>>> class X:
...     a = 'hello'
...     def __init__(self, b):
...         self.b = b
...     @classmethod
...     def my_method(cls, c=X.a):
...         print 'cls.a = {}'.format(cls.a)
...         print 'c = {}'.format(c)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in X
NameError: name 'X' is not defined

1 Ответ

3 голосов
/ 06 июня 2019

Это действительно зависит от того, что вы хотите, но один из способов получить то, что вы, кажется, хотите, это сделать так.

class X:
    a = 'hello'
    def __init__(self, b):
        self.b = b
    @classmethod
    def my_method(cls, c=None):
        if c is None:
            c = X.a
        print('cls.a = {}'.format(cls.a))
        print('c = {}'.format(c))

X.my_method()

Сделайте значение по умолчанию None и проверьте наличие None в теле функции, назначив c, если будет установлено, что оно None. Если вы когда-нибудь хотели, чтобы None был допустимым аргументом для функции, тогда это не сработало бы, но это маловероятно.

Эта идиома часто используется в python, чтобы избежать изменяемого по умолчанию аргумента «подводные камни», но здесь он задерживает присваивание с X.a до тех пор, пока X не будет фактически определено.

Это также означает, что если вы измените X.a, my_method подберет новое значение. Вы можете или не можете этого хотеть.

...