Пожалуйста, помогите мне в понимании класса в Python - PullRequest
1 голос
/ 28 октября 2009

Я новичок, и мне очень трудно понять синтаксис Class в python. У меня есть опыт работы с C / C ++, java и целью C. Очень большая разница, которую я замечаю в python, заключается в том, что вы явно не объявляете «членов данных» в классе, а просто добавляете их случайно? И это приводит к довольно большой путанице.

Допустим, у меня есть класс

class MyClass:

    def __int__(self, a, b):

        self.a = a

        self.b = b

А потом, когда я инициирую объект.

myobject = MyClass(10,10)

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

Ответы [ 3 ]

5 голосов
/ 28 октября 2009

Короче говоря, Да .

Ты прав. Python позволяет добавлять (и удалять!) Членов из объектов по желанию, в любое время. В конструкторе нет ничего особенного, что позволяет ему делать все, что не могут другие функции.

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

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

2 голосов
/ 28 октября 2009

Вы действительно должны использовать в своем тексте . : p

Не могли бы вы иметь в виду:

class MyClass:
    def __int__(self, a, b, c=None):
        self.a = a
        self.b = b
        self.c = c

one = MyClass(1,2)
one.c # None
two = MyClass(1,2,3)
two.c # 3
0 голосов
/ 28 октября 2009
class MyClass:
    def __int__(self, a, b):
        self.a = a
        self.b = b
        self.c = None  #This line is optional

    def set_c(self, c):
        self.c = c

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

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