Python Инстанцирующие Подклассы - PullRequest
1 голос
/ 07 января 2010

Я написал следующий код, пытаясь выяснить, как создавать экземпляры подклассов в основном классе ... Я придумал что-то, что не подходит ... по крайней мере для меня

Что-то не так с этим типом инстансинга? Есть ли лучший способ для вызова подклассов?

class Family():
  def __init__(self):
    self.Father = self.Father(self)
    self.Mother = self.Mother(self)

  class Father():
    def __init__(self, instance = ''):
      self = instance if instance != '' else self
      print self

    def method(self):
      print "Father Method"

    def fatherMethod(self):
      print "Father Method"


  class Mother():
    def __init__(self, instance = ''):
      self = instance if instance != '' else self
      print self

    def method(self):
      print "Mother Method"

    def motherMethod(self):
      print "Mother Method"



if __name__ == "__main__":
  Family = Family()
  Family.Father.method()
  Family.Mother.method()

Ответы [ 3 ]

6 голосов
/ 07 января 2010

То, что вы определили, есть не (по крайней мере, в терминологии Python) подклассы - это внутренние классы или вложенные классы. Я предполагаю, что на самом деле это не то, чего вы пытались достичь, но я не уверен, чего вы на самом деле хотели - но вот мои четыре лучших предположения:

  1. Подкласс - это когда класс, наследуемый от другого класса, называется подклассом. Чтобы сделать father подклассом family, используйте синтаксис class Father(Family):. То, что вы создали здесь, на самом деле называется Внутренним классом, а не подклассом.

  2. Когда вы видите что-то вроде Family.Father.method(), это часто означает, что Family - это модуль , а Father - это класс в этом модуле. В Python module в основном означает .py file. Модуль не имеет метода __init__, но весь код на верхнем уровне модуля (например, строка if __name__ ...) выполняется при импорте модуля.

  3. Аналогично, вы можете сделать Family пакетом - что в Python означает каталог в файловой системе, содержащий файл __init__.py. Father и Mother будут модулями или классами в пакете

  4. Возможно, вы пытаетесь достичь, объявив, что объект типа Family всегда имеет объект Father и объект Mother. Это не требует вложенных классов (на самом деле, вложенные классы - совершенно причудливый способ сделать это). Просто используйте:

>>> class Mother():
...   def whoami(self):
...     print "I'm a mother"
... 
>>> class Father():
...   def whoami(self):
...     print "I'm a father"
...
>>> class Family():
...   def __init__(self):
...     self.mother = Mother()
...     self.father = Father()
...  
>>> f = Family()
>>> f.father.whoami()
I'm a father
>>> f.mother.whoami()
I'm a mother
>>> 
1 голос
/ 07 января 2010

Blergh.

Почему Отец и Мать вложены в Семью? Там нет причин, чтобы сделать это. Определите их снаружи, а затем создайте их внутри.

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

1 голос
/ 07 января 2010

Вы правы, этот код не кажется правильным. Мои вопросы будут ..

  • Чего вы пытаетесь достичь? Нет необходимости определять Father и Mother внутри Family, они могут быть определены вне Family и объединены в него. (Это тот факт, что к Father и Mother нельзя обращаться за пределами Family? Python не имеет модификаторов видимости, например, из-за принципа, который гласит: «мы все здесь выросли», то есть что разработчики должны нести ответственность и брать на себя ответственность за обработку кода ...)

  • Тебе действительно нужно что-то вроде Class.Class.method? Помимо того, что поиск методов немного дорог, такие цепочки могут указывать на неправильную ось , что означает, что вы пытаетесь ухватиться за функциональность с не очень четко разработанной точки (извините за то, что так размыто здесь.)

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