Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.
например: скажем, у вас есть класс под названием 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;
}
}
Из того, что я понимаю, каждый экземпляр класса хранит ссылки на методы экземпляра.
blockquote>Я не знаю, откуда вы это взяли, но это неправильно. Они не делают.
Почему методы экземпляра недоступны способом, аналогичным атрибутам экземпляра, то есть через
blockquote >__dict__
или через какой-либо другой системный атрибут?Ну, потому что они не хранятся в экземпляре.
Есть ли способ посмотреть (и, возможно, изменить) имена и ссылки на методы экземпляра?
blockquote>Поскольку эти ссылки не существуют, вы не можете их изменить. Конечно, вы можете создать любой атрибут, который вы хотите, с помощью обычных назначений, но обратите внимание, что функции, хранящиеся в экземпляре, не рассматриваются как обычные методы - механизм, который неявно передает параметр
self
, не применяется для них.
Другой пример
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()
Поиск атрибутов объектов в Python нетривиальен. Но методы экземпляра, конечно, не хранятся в экземпляре объекта!
Поведение по умолчанию для доступа к атрибутам - это получение, установка или удаление атрибута из словаря объекта. Например,
blockquote>a.x
имеет цепочку поиска, начиная сa.__dict__['x']
, затемtype(a).__dict__['x']
и продолжается через базовые классыtype(a)
, исключая метаклассы.( docs )
Обратите внимание, что есть , чтобы сохранить функцию в экземпляре. Но это не метод экземпляра! Когда интерпретатор ищет атрибут и обнаруживает, что он (a) является функцией и (b) для объекта класса, он автоматически переносит его в объект связанного метода, который передает
self
.
Есть ли способ посмотреть (и, возможно, изменить) имена и ссылки на методы экземпляра?
blockquote>Ну, вы можете, конечно, изменить объект класса после его определения. Но я предполагаю, что вы имеете в виду: «Можете ли вы сделать метод
x
конкретного экземпляра конкретного сделать что-то другое?»Это Python, ответ «да»: просто определите
a.x
как некоторую новую функцию. Затем вы получите эту функцию, прежде чем смотреть на класс.Это может вызвать у вас много путаницы, когда вы пытаетесь понять код!
Неправильно. Экземпляры не хранят ссылки на каждый метод.
Например:
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
, метод не имеет понятия, к какому экземпляру он работает.