Python - каковы ваши соглашения для объявления ваших атрибутов в классе? - PullRequest
4 голосов
/ 30 декабря 2010

В Python я могу объявлять атрибуты по всему классу. Например:

class Foo:
def __init__(self):
    self.a = 0

def foo(self):
    self.b = 0

Трудно получить все атрибуты в моем классе, когда у меня большой класс с большим количеством атрибутов.

Лучше иметь следующий код (а) или следующий следующий код (б):

a) Здесь трудно найти все атрибуты:

class Foo:
    def __init__(self):
        foo_1()
        foo_2()

    def foo_1(self):
        self.a = 0
        self.b = 0

    def foo_2(self):
        self.c = 0

b) Здесь легко найти все атрибуты, но красиво ли это?

class Foo:
    def __init__(self):
        (self.a, self.b) = foo_1()
        self.c = foo_2()

    def foo_1(self):
        a = 0
        b = 0
        return (a, b)

    def foo_2(self):
        c = 0
        return c

В двух словах, каковы ваши соглашения по объявлению ваших атрибутов в классе?

EDIT:

Конечно, это простой пример, и нет необходимости улучшать мой код здесь. Представьте себе сложный класс с множеством «маленьких методов» (чтобы разделить мой код, чтобы улучшить читаемость), вызываемых в _ init_ ().

Ответы [ 4 ]

4 голосов
/ 30 декабря 2010

В идеале ваш конструктор не должен вызывать методы: конструктор не должен выполнять реальную работу .

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

4 голосов
/ 30 декабря 2010

Что не так с этим:

class Foo:
    def __init__(self):
        self.a = 0
        self.b = 1
        self.c = 2

Или, если a, b и c связаны каким-либо образом, вы можете объявить их в одной строке:

class Foo:
    def __init__(self):
        self.a, self.b, self.c = 0, 1, 2

Или, если a, b и c связаны каким-либо образом и , вы инициализируете их одним и тем же неизменным значением, вы можете объявить их в одном присваивании:

class Foo:
    def __init__(self):
        self.a = self.b = self.c = 0
0 голосов
/ 30 декабря 2010

В Python я могу объявить атрибуты во всем классе.

Correct.

Трудно восстановить все атрибуты в моем классе, когда у меня есть большой класс с множеством атрибутов.

Нет. dir(object) или obj.__dict__ полезны там. И кроме того, почему вы хотите получить все атрибуты?

Здесь трудно найти все атрибутов

Хороший редактор / IDE может помочь вам найти определение. Я использую WingIDE для этого, это очень хорошо.

Здесь легко найти все атрибуты, но это красиво?

Ну, этот конкретный код, возможно, нет, но довольно часто объявляются все открытые атрибуты в __init__ или в классе (но остерегайтесь Jabberwock , когда вы делаете это). Таким образом, вы знаете, что они доступны, и это хорошо.

0 голосов
/ 30 декабря 2010

Прежде всего, здесь речь идет не об атрибутах класса, а об атрибутах экземпляра.Я согласен с этим, но все они в конструкторе со значением None, если они инициализируются в другом методе.Таким образом, я всегда могу сказать, чего ожидать.Это все равно что объявлять их, даже если это не обязательно.

Например:

class Foo(object):
    def __init__(self, a=None, b=None, c=None):
        self.a = a
        self.b = b
        self.c = c

Ну, я также люблю делать инициализаторы в качестве аргументов ключевых слов, это делает его более гибким.Таким же образом я могу легко изменить настройки по умолчанию.

...