Могу ли я создать новый объект без использования функциональной нотации? Зачем? - PullRequest
0 голосов
/ 02 января 2011

Если я сделаю простой класс, подобный этому:

class Foo:
  i = 1
  j = 2

Могу ли я создать новый объект, просто используя Foo с правой стороны (в отличие от произнесения Foo ())?Я бы не догадался, но я просто попробовал следующее, и это сработало:

finst = Foo
print finst.i

Ответы [ 4 ]

4 голосов
/ 02 января 2011

Это работает, потому что i - это не свойство объекта (или экземпляра), а класса.Вы не создаете новый экземпляр.

Попробуйте:

class Foo:
  def bar(self):
    print 42

finst = Foo
finst.bar()

Traceback (последний вызов был последним):
File "", строка1, в
TypeError: необязательный метод bar () должен вызываться с экземпляром Foo в качестве первого аргумента (вместо этого ничего не получил)

1 голос
/ 02 января 2011

Foo сам по себе является объектом класса для class Foo:

>>> type(Foo)
<type 'classobj'>
>>> type(Foo())
<type 'instance'>

Ваш код:

finst = Foo
print finst.i

декодируется как:

  1. привязать имя finst к объекту класса Foo.
  2. распечатать значение атрибута класса i
1 голос
/ 02 января 2011

Это потому, что finst является просто псевдонимом для класса Foo, а i и j являются переменными класса, а не переменными экземпляра.Если вы объявили их как переменные экземпляра:

class Foo:
    def __init__(self):
        self.i = 1
        self.j = 2

Тогда ваш код вызовет ошибку.

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

1 голос
/ 02 января 2011

Вы не создали экземпляр объекта.Вы только что определили переменную в области видимости класса и получили к ней доступ.

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