class属性无法正常工作(python)

时间:2017-05-10 16:48:38

标签: python

尝试为纸牌游戏设计Hand类 我从属性

中遇到了一个奇怪的行为

如果我尝试设置self.number,如下所示,它将不会显示正确的输出 但是如果我通过函数total()创建相同的参数它可以正常工作

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

class Hand (object):

def __init__(self,number=0,cards=[]):

    self.cards=cards

    self.number=len(self.cards)

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

hand=Hand()
hand.cards.append(9)

print hand.cards
print len(hand.cards)
print hand.number
print hand.total()

output:
[9]
1
0    #I want this to be equal to 1
1

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

您的程序运行正常:创建对象时,len(self.cards)为0,因此self.number设置为0.更改hand.cards时,没有更改语句{{ 1}},所以它保持为0。

进行self.number属性更新的正确方法是使用getter-setter pair,以确保在self.number更改时self.number更改。

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

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

self.cards

这样,即使任何人都在使用你的类来读取属性,但实际发生的事情是调用class Hand(object): def __init__(self, number = 0, cards = None): self.cards = cards or [] @property def number(self): return len(self.cards) 方法并正确计算{{1}的当前长度}。