Почему плохо использовать типы данных для инициализации экземпляров в Python? - PullRequest
1 голос
/ 06 января 2012

Извините, если ответ на этот вопрос очевиден, но я хочу быть уверенным, если у вас есть (в Python):

class Name(object):

    def __init__(self):
        self.int_att1 = 0
        self.int_att2 = 0
        self.list_att = []

почему не можете (я знаю, что вы можете, но яникогда не видел, чтобы программист делал это), вы инициализируете это следующим образом:

class Name(object):

    def __init__(self):
        self.int_att1 = int
        self.int_att2 = int
        self.list_att = list

Есть ли плохие эффекты, которые возникают из-за этого?Что делает первое более Pythonic?

На мой взгляд, Python нуждается в значении instance.attribute .Но если это так, то почему работает тип данных ?

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Когда вы делаете self.int_att1 = int, атрибут int_att1 теперь ссылается на тип int, я имею в виду, это просто другое имя для int.И я докажу это простым способом:

>>> number_type = int
>>> i = number_type()
>>> i
0
>>> type(i)
<type 'int'>

В этом коде number_type становится «синонимом» для типа int, поэтому, когда я спросил тип i, он вернул int, а не number_type.

То же самое для self.list_att = list.


Возможно, вы хотели сделать следующее:

class Name(object):

    def __init__(self):
        self.int_att1 = int()
        self.int_att2 = int()
        self.list_att = list()

Это совершенно другое, вы больше не назначаете тип атрибуту.Вместо этого вы назначаете начальное значение этого типа.Давайте посмотрим, каковы эти начальные значения:

>>> initial_int = int()
>>> initial_int
0
>>> initial_list = list()
>>> initial_list
[]

Итак, мы можем ясно видеть, что начальное значение типа int равно 0, а начальное значение типа list равно [] и это именно то, что вы искали!

2 голосов
/ 06 января 2012

Вы можете , но это имеет совершенно другой эффект.Во втором случае вы устанавливаете атрибут равным значению типа, что обычно не то, что вы хотите.В Python типы тоже являются объектами, поэтому это допустимо.

Это позволит вам сделать что-то вроде:

n = Name()

v = n.int_att1()

v будет тогда 0, потому что это значение, построенное из int конструктор без аргументов.

0 голосов
/ 06 января 2012

С Дзен Python : «Явное лучше, чем неявное».

Конечно, вы можете инициализировать значением по умолчанию для типа (а не для самого типа, как в вашем примере), но явное лучше, чем неявное. Когда вы инициализируете с фактическим значением, нет сомнений в том, что вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...