__init __()中定义的类属性与类方法定义的属性

时间:2018-06-22 21:33:22

标签: python python-3.x

根据我在以下代码中测试的内容,当我在Matter()类中定义self.location属性时,以及当我尝试将值分配给实例时,它均无效。

>
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)

额外的问题:我可以在类中创建的任何属性和方法都可以通过使用类中没有的其他函数来使用和修改吗? 我可能在属性和实例之间感到困惑,但是如果有人可以澄清我将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:2)

这是属性的用途。

考虑属性,例如像属性一样起作用的方法。您需要在请求时即时计算某些内容,但返回的内容实际上并不是 action ,而是更多的 state 。那是财产。

在这种情况下,您有:

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)