На основании того, что я тестировал в следующем коде, когда я определяю атрибут self.location в классе Matter(), и когда я пытаюсь присвоить значение экземпляру, он не работает.
class Matter():
"""docstring for Matter"""
def __init__(self):
self.xcoord = 0
self.ycoord = 0
self.location = (self.xcoord, self.ycoord)
main = Matter()
#before changing values
print(main.xcoord, main.ycoord)
#changing values
main.xcoord = 5
main.ycoord = 10
print(main.xcoord, main.ycoord)
print(main.location)
выход:
self.location в этом случае не изменилось. но когда я это делаю:
main = Matter()
# before changinv the values
print(main.xcoord, main.ycoord)
# changing the values
main.xcoord = 5
main.ycoord = 10
print(main.xcoord, main.ycoord)
print(main.location)
class Matter():
"""docstring for Matter"""
def __init__(self):
self.xcoord = 0
self.ycoord = 0
def set_location(self):
self.location = (self.xcoord, self.ycoord)
main = Matter()
print(main.xcoord, main.ycoord)
main.xcoord = 5
main.ycoord = 10
Matter.set_location(main)
print(main.xcoord, main.ycoord)
print(main.location)
выход:
вопрос о бонусе: Любой атрибут и метод, которые я могу создать в классе, можно использовать и модифицировать, используя разные функции, которые не входят в класс? Я мог бы путать между атрибутом и экземпляром там, но если кто-то может уточнить, я был бы благодарен!
Спасибо!
Для этого нужны свойства.
Подумайте о свойствах, таких как методы, которые действуют как атрибуты. Вам нужно вычислить что-то "на лету", когда оно просило, но то, что он получает, на самом деле не является действием, которое больше относится к состоянию. Это свойство.
В этом случае у вас есть:
class Matter():
def __init__(self):
self.x = 5
self.y = 10
@property
def location(self):
return (self.x, self.y)
Теперь вы можете использовать location
как если бы оно было атрибутом, в то время как оно по-прежнему работает как метод.
m = Matter()
m.location # (5, 10)
m.x, m.y = (20, 40)
m.location # (20, 40)
Однако вы НЕ МОЖЕТЕ установить через свойство...
m.location = (40, 80) # error
... если вы не напишите сеттер
# inside class Matter, after the code above
...
@location.setter
def location(self, newloc):
self.x, self.y = newloc
Теперь вы можете, и он обновляется так же, как вы говорите.
m.location = (40, 80)
m.x # 40
m.y # 80
m.location # (40, 80)
self.location = self.xcoord, self.ycoord
, вы пытались сказать, что «location - это всегда значениеself.xcoord
сочетании со значениемself.ycoord
». То, что фактически сделал ваш код , было «хорошо, поэтому возьмите значение, хранящееся вxcoord
и значение, сохраненное вycoord
и сохраните эти значения также вlocation
.