Атрибуты класса, определенные в __init __ (), против атрибутов, определенных методом класса

1

На основании того, что я тестировал в следующем коде, когда я определяю атрибут 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)

выход:

  • 0 0
  • 5 10
  • (0, 0)

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)

выход:

  • 0 0
  • 5 10
  • (5, 10)

вопрос о бонусе: Любой атрибут и метод, которые я могу создать в классе, можно использовать и модифицировать, используя разные функции, которые не входят в класс? Я мог бы путать между атрибутом и экземпляром там, но если кто-то может уточнить, я был бы благодарен!

Спасибо!

Теги:
python-3.x

1 ответ

2

Для этого нужны свойства.

Подумайте о свойствах, таких как методы, которые действуют как атрибуты. Вам нужно вычислить что-то "на лету", когда оно просило, но то, что он получает, на самом деле не является действием, которое больше относится к состоянию. Это свойство.

В этом случае у вас есть:

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)
  • 0
    Кроме того, это то, что подразумевается, когда люди говорят, что Python назначает по значению . Когда вы делали self.location = self.xcoord, self.ycoord , вы пытались сказать, что «location - это всегда значение self.xcoord сочетании со значением self.ycoord ». То, что фактически сделал ваш код , было «хорошо, поэтому возьмите значение, хранящееся в xcoord и значение, сохраненное в ycoord и сохраните эти значения также в location .
  • 0
    Замечательно! именно то, что мне было нужно. если бы я установил mx = 15 и my = 10, это работало бы так же, как @property? другими словами, это также обновит m.location?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню