метод экземпляра python diff [duplicate]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

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

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
4
задан max 19 March 2012 в 19:03
поделиться

4 ответа

Из того, что я понимаю, каждый экземпляр класса хранит ссылки на методы экземпляра.

Я не знаю, откуда вы это взяли, но это неправильно. Они не делают.

Почему методы экземпляра недоступны способом, аналогичным атрибутам экземпляра, то есть через __dict__ или через какой-либо другой системный атрибут?

Ну, потому что они не хранятся в экземпляре.

Есть ли способ посмотреть (и, возможно, изменить) имена и ссылки на методы экземпляра?

Поскольку эти ссылки не существуют, вы не можете их изменить. Конечно, вы можете создать любой атрибут, который вы хотите, с помощью обычных назначений, но обратите внимание, что функции, хранящиеся в экземпляре, не рассматриваются как обычные методы - механизм, который неявно передает параметр self, не применяется для них.

5
ответ дан Sven Marnach 26 August 2018 в 21:49
поделиться

Другой пример

class Point:
    def __init__(self, xcoord, ycoord):
        self.x = xcoord
        self.y = ycoord
    def draw(self):
        print self.x, " ", self.y

p = Point(205.12, 305.21)

#draw the coordinates of the point instance

p.draw()

# now define a new point drawing function vdraw()

def vdraw(q):
    print "[",q.x,",",q.y,"]"

#p.draw()

#now reassign the draw() method to vdraw()

Point.draw = vdraw

# now print the coordinates of the point instance 

print p.x
print p.y

#now draw the coordinates of the point instance
p.draw()
1
ответ дан Ethan Furman 26 August 2018 в 21:49
поделиться

Поиск атрибутов объектов в Python нетривиальен. Но методы экземпляра, конечно, не хранятся в экземпляре объекта!

Поведение по умолчанию для доступа к атрибутам - это получение, установка или удаление атрибута из словаря объекта. Например, a.x имеет цепочку поиска, начиная с a.__dict__['x'], затем type(a).__dict__['x'] и продолжается через базовые классы type(a), исключая метаклассы.

( docs )

Обратите внимание, что есть , чтобы сохранить функцию в экземпляре. Но это не метод экземпляра! Когда интерпретатор ищет атрибут и обнаруживает, что он (a) является функцией и (b) для объекта класса, он автоматически переносит его в объект связанного метода, который передает self.


Есть ли способ посмотреть (и, возможно, изменить) имена и ссылки на методы экземпляра?

Ну, вы можете, конечно, изменить объект класса после его определения. Но я предполагаю, что вы имеете в виду: «Можете ли вы сделать метод x конкретного экземпляра конкретного сделать что-то другое?»

Это Python, ответ «да»: просто определите a.x как некоторую новую функцию. Затем вы получите эту функцию, прежде чем смотреть на класс.

Это может вызвать у вас много путаницы, когда вы пытаетесь понять код!

5
ответ дан Katriel 26 August 2018 в 21:49
поделиться

Неправильно. Экземпляры не хранят ссылки на каждый метод.

Например:

class Foo():
    def bar(self):
        print 'bar'

f = Foo()
def alternate_bar(self):
    print 'alternate bar'

f.bar()    
Foo.bar = alternate_bar # modifies the class!
f.bar()

печатает

bar
alternate bar

. Именно поэтому вы предоставляете self для каждого метода, который вы определяете в классе. Без ссылки на self, метод не имеет понятия, к какому экземпляру он работает.

1
ответ дан Steven Rumbalski 26 August 2018 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: