нужно ли объекту python давать то же количество аргументов, что и его классу? - PullRequest
0 голосов
/ 06 мая 2011

Итак, я наткнулся на это определение класса в руководстве по Pygame:

class GameObject:
        def _init_(self,image,height,speed):
                self.speed = speed
                self.image = image
                self.pos = image.get_squarerect().move(0,height)
        def move(self):
                self.pos = self.pos.move(0, self.speed)
                if self.pos.right > 600:
                        self.pos.left = 0

Затем кодер делает это, чтобы заполнить массив (?) Объектами:

objects = []
for x in range(10):
    o=GameObject(player, x*40, x)
    objects.append(o)   

Мой вопрос: почему при создании экземпляра объекта передается только 3 аргумента, но класс был создан для принятия 4 из них?

Ответы [ 3 ]

1 голос
/ 06 мая 2011

self передается неявно, это ссылка на текущую реализацию объекта.Это обсуждается в официальном уроке здесь: http://docs.python.org/release/2.7/tutorial/classes.html#random-remarks

1 голос
/ 06 мая 2011

Объект self предоставляется неявно при каждом вызове метода.

Для __init__ это новый объект, и Python предоставляет ссылку на этот новый объект как self.

Длявызовы метода, отличные от __init__, вы фактически предоставляете объект, на который ссылается self, не в качестве явного аргумента, а в объекте, которому вы вызываете метод (которому соответствует object.method (foo), внутри определения класса объекта, "метод def (self, foo)").

Итак, в вашем примере __init__ принимает 4 аргумента (включая self), но вызывается только с 3 (исключая self).Метод "move" принимает 1 аргумент (self), но вызывается с 0 аргументами.

0 голосов
/ 06 мая 2011

Python требует, чтобы первым аргументом любого метода экземпляра было любое имя, которое вы выбрали для ссылки на текущий экземпляр.

Использование имени 'self' является соглашением, которое, imo, должно строго соблюдаться, но является просто соглашением.

В случае, если вы никогда не сталкивались с языком, который использовал 'self' или 'this', вот краткое изложение того, что происходит:

Определение класса означает, что вы пишете код внутрикоробка (действительно «пространство имен») для последующего использования.«Позднее использование» в основном означает, что вы создадите экземпляр класса, тем самым создав объект.Хотя вы вполне можете создать экземпляр своего объекта, выполнив «myobj = myClass», тем самым сделав имя вашего объекта «myobj», нет никакого способа узнать, каким будет его имя во время написания кода для класса.Вот почему вы используете «я».

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