Чтобы опираться на то, что сказали все остальные, да, вам нужно вызвать метод родителя __init__
.
Обычно лучше использовать супер. Однако в некоторых случаях (особенно когда вы наследуете от нескольких классов) это может быть большая проблема. Я не буду вдаваться в подробности, нет недостатка в различных статьях, которые обсуждают это . (Кроме того, есть некоторые странности с некоторыми другими «специальными» функциями. Например, вы можете делать super(SomeCls, self).__getitem__(5)
, но super(SomeCls, self)[5]
не будет работать.)
В качестве упрощенного примера того, почему хорошая идея использовать его, вы можете сделать Dog
и Cat
наследовать от Mammal
(который наследуется от Animal
) и не менять места в вашем коде, кроме класса Dog
и Cat
inherit from.
Что касается того, почему ваш экземпляр tom
не имеет tom.nlegs
, это потому, что вы не вызвали метод Animal
__init__
.
Также помните, что не все должно быть установлено во время инициализации. В этом примере имеет смысл не устанавливать такие вещи, как nlegs
в методе __init__
. Вместо этого просто установите его непосредственно в классе. Например,
class Mammal(object):
nlimbs = 4
def __init__(self):
print "I'm a mammal!"
class Cat(Mammal):
def __init__(self, color="calico"):
self.color = color
super(Cat, self).__init__()
print "I have {0} legs I am {1}".format(self.nlimbs, self.color)
class FiveLeggedCat(Cat):
nlimbs = 5
В принципе, если что-то может измениться от экземпляра к экземпляру (например, цвет кошки) или должно быть выполнено при инициализации (например, открытие файла), то это, вероятно, должно быть установленным в __init__
.
В противном случае, если это то, что мы хотим быть одинаковым для любого экземпляра класса, его можно установить чище, чтобы установить его непосредственно в определении класса.
Кроме того, атрибуты, установленные таким образом, будут доступны для инструментов документации (например, встроенная функция help
), тогда как атрибуты, установленные при инициализации, не будут.
Ваш сервис работает как пользователь. Обычно, когда вы создаете сервис, он устанавливает там учетную запись по умолчанию. Когда вы запускаете код вручную, он выполняется под вашими привилегиями. Когда служба запускает код, привилегии предоставляются учетной записи, под которой запускается служба. Просто зайдите на этот сервис и попробуйте запустить себя как