尝试为纸牌游戏设计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
答案 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.number
时self.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}的当前长度}。