类属性不能正常工作(python)

类属性不能正常工作(python),python,Python,在尝试为一场纸牌游戏设计手牌课程时 我遇到一个属性的奇怪行为 如果我试图设置如下所示的self.number,它将不会显示正确的输出 但是如果我通过一个函数total()使用相同的参数,它会正常工作 我的问题是:为什么属性self.number没有获得len(self.cards)的值 属性self.number在实例化时设置,请改用属性 class Hand (object): def __init__(self, cards=None): self.cards = c

在尝试为一场纸牌游戏设计手牌课程时 我遇到一个属性的奇怪行为

如果我试图设置如下所示的
self.number
,它将不会显示正确的输出 但是如果我通过一个函数
total()
使用相同的参数,它会正常工作

我的问题是:为什么属性
self.number
没有获得
len(self.cards)
的值


属性
self.number
在实例化时设置,请改用属性

class Hand (object):
    def __init__(self, cards=None):
        self.cards = cards or []

    @property
    def number(self):
        return len(self.cards)

    def total(self):
        return len(self.cards)

属性
self.number
在实例化时设置,请改用属性

class Hand (object):
    def __init__(self, cards=None):
        self.cards = cards or []

    @property
    def number(self):
        return len(self.cards)

    def total(self):
        return len(self.cards)

将实例变量设置为表达式不会在该表达式的输入和实例变量的值之间创建绑定。换句话说,将
self.number
设置为
len(self.cards)
并不意味着每当您更新
self.cards
时,
self.number
将得到更新

程序运行正常:创建对象时,
len(self.cards)
为0,因此
self.number
设置为0。更改
手牌
时,不会有语句更改
self.number
,因此它保持为0

更新
self.number
属性的正确方法是使用,以确保
self.number
self.cards
更改时更改

创建getter-setter对的Pythonic方法是使用

在您的情况下,您可以这样做:

class Hand(object):
    def __init__(self, number = 0, cards = None):
        self.cards = cards or []

    @property
    def number(self):
        return len(self.cards)

这样,即使任何使用您的类的人都认为他们正在读取属性,但实际情况是,
number()
方法被调用并正确计算
self.cards的当前长度

将实例变量设置为表达式不会在该表达式的输入和实例变量的值之间创建绑定。换句话说,将
self.number
设置为
len(self.cards)
并不意味着每当您更新
self.cards
时,
self.number
将得到更新

程序运行正常:创建对象时,
len(self.cards)
为0,因此
self.number
设置为0。更改
手牌
时,不会有语句更改
self.number
,因此它保持为0

更新
self.number
属性的正确方法是使用,以确保
self.number
self.cards
更改时更改

创建getter-setter对的Pythonic方法是使用

在您的情况下,您可以这样做:

class Hand(object):
    def __init__(self, number = 0, cards = None):
        self.cards = cards or []

    @property
    def number(self):
        return len(self.cards)

这样,即使任何使用您的类的人都认为他们正在读取属性,但实际发生的情况是调用
number()
方法并正确计算
self.cards

的当前长度,因此对于所有a:\uu init\uu(a):self.a=a仅在启动时检查和使用谢谢您的帮助:)@Jared
@属性
装饰器通过自动给我
设置
获取
命令来节省时间和精力,对吗?可以通过手动定义
属性的各个方面来实现相同的功能?谢谢@patrick:@property decorator将它所修饰的方法变成getter。类的用户将能够像访问属性一样访问
number
。要创建setter,您需要使用
@attribute\u name.setter
(在本例中是
@number.setter
)装饰setter方法。这里有一些关于如何实现
@property
的信息。因此,对于所有a:u init\uuu(a):self.a=a仅在启动时检查和使用谢谢您的帮助:)@Jared
@属性
装饰器通过自动给我
设置
获取
命令来节省时间和精力,对吗?可以通过手动定义
属性的各个方面来实现相同的功能?谢谢@patrick:@property decorator将它所修饰的方法变成getter。类的用户将能够像访问属性一样访问
number
。要创建setter,您需要使用
@attribute\u name.setter
(在本例中是
@number.setter
)装饰setter方法。这里有一些关于
@property
如何实现的信息。