Почему вам не нужно объявлять (объект) для класса, который имеет только __init__ в python? - PullRequest
0 голосов
/ 18 июля 2011

Спасибо за помощь n00b

Пример того, о чем я говорю:

class Complex:
    def __init__(self,x,y):
        self.x = x
        self.y = y

Почему, когда вы объявляете класс, вам не нужно добавлять (объект) к нему,

class Complex(object):

Ответы [ 3 ]

3 голосов
/ 18 июля 2011
class Complex1:
    def __init__(self,x,y):
        self.x = x
        self.y = y

>>> dir(Complex1)
['__doc__', '__init__', '__module__']    

class Complex2(object):
    def __init__(self,x,y):
        self.x = x
        self.y = y

>>> dir(Complex2)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_
_weakref__']
3 голосов
/ 18 июля 2011

В Python 2.x это делает ваш класс в старом стиле с другой семантикой наследования. Поскольку вы не используете наследование (и порядок разрешения методов одинаков в простых случаях), на практике это не имеет значения. Если вы программируете на Python 2.x, вы должны добавить (object), чтобы воспользоваться преимуществами классов нового стиля.

В Python 3.2 object - это просто класс по умолчанию, от которого вы наследуете, и его можно не указывать.

0 голосов
/ 18 июля 2011

Когда вы определяете класс просто так class Complex, вы не наследуете класс от любого другого класса и, следовательно, он имеет только те атрибуты, которые вы определяете как __init____doc__ и __module__.)Это класс старого стиля.

Когда вы определяете такой класс - class Complex(object), это означает, что вы наследуете класс от класса object.В результате многие его атрибуты наследуются автоматически без необходимости самим определять их снова, например __str__, __class__ и т. Д. Это новый стиль класс.

В Python2.x новые классы стилей обычно предпочтительнее, так как использование классов старых стилей может привести к некоторым проблемам.Например, __slots__, super, descriptors не работают в классах старого стиля.

Классы старого стиля были сохранены в python 2.x просто для обеспечения обратной совместимости.В Python 3 это очищено, и любой класс, который вы определяете, является новым классом стиля.

(Кроме того, из того, что вы говорите, наследование от object не имеет ничего общего только с определением __init__.)

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