Экземпляр класса создается сразу внутри литерала списка? - PullRequest
0 голосов
/ 14 апреля 2019

Я создал два простых класса с конструкторами __init__(), а затем создал их экземпляры в списке.

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

#First Class
class myClassOne(object):
  def __init__(self, a):
    self.a = a
  def __str__(self):
    return self.a

#Second class
class myClassTwo(object):
  def __init__(self, a):
    self.a = a
  def __str__(self):
    return self.a

#Instance of classes being called as an object inside the list
a = [1,2,3,myClassOne("hello"),myClassTwo("world"),"blah","blah"]
print(id(a[3]),id(a[4]))
print(a[3],a[4])

Вывод:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
140362290864536 140362290864592
hello world

1 Ответ

2 голосов
/ 14 апреля 2019

Вы можете легко проверить это, добавив несколько print операторов:

class myClassOne:

    def __init__(self, a):
        self.a = a
        print("myClassOne instance created.")

    def __str__(self):
        return self.a


class myClassTwo:

    def __init__(self, a):
        self.a = a
        print("myClassTwo instance created.")

    def __str__(self):
        return self.a


print("Creating list 'a' ...")
a = [1, 2, 3, myClassOne("hello"), myClassTwo("world"), "blah", "blah"]
print("... list 'a' created.")

print("Printing ids ...")
print(id(a[3]), id(a[4]))
print("... ids printed.")

print("Printing items ...")
print(a[3], a[4])
print("... items printed.")

Вот результат этого:

$ python3 hello.py 
Creating list 'a' ...
myClassOne instance created.
myClassTwo instance created.
... list 'a' created.
Printing ids ...
139953120034712 139953120034656
... ids printed.
Printing items ...
hello world
... items printed.

Как видите, экземпляры созданыпри создании списка a.

Это всегда так: когда вы говорите Python что-то сделать, он делает это немедленно, независимо от того, является ли эта инструкция частью построения списка или какой-либо другой.похожий объект.

Обратите внимание, что существует разница между указанием Python на сделать что-то (как в случае, когда вы создаете этот список) и сообщением how сделать что-то (как в случае, когда вы определяете myclassOne.__init__().

Когда вы определяете функцию или метод с помощью блока def ..., вы сообщаете Python как :сделать что-то, и на самом деле это не будет сделано, пока вы не вызовете эту функцию или метод.

Когда вы создаете список, вы говорите Python to что-то сделать, так что он просто идетвперед и делает это.

...