类属性不工作正常(蟒蛇)

问题描述:

虽然试图拿出一个手工类卡片游戏 我遇到了从属性一个奇怪的行为类属性不工作正常(蟒蛇)

,如果我尝试设置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 

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

因此对于所有a:__init __(a):self.a = a仅在启动期间被检查和使用 感谢您的帮助:) –

+0

@Jared @ @ property'装饰器节省了时间和精力,事情,自动给我'set'和'get'命令,是吗?人们可以通过手动定义“财产”的方面来实现相同的目标吗?谢谢! – patrick

+1

@patrick:@property装饰器使它装饰成一个getter的方法。该类的用户将能够像访问属性一样访问“数字”。为了制作一个setter,你用'@ attribute_name.setter'来装饰setter方法(在这种情况下,它将是'@ number.setter')。 –

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

你的程序运行正常:当您创建对象时,len(self.cards)是0,所以self.number被设置为0。当您更改hand.cards,没有语句改变self.number,使其保持0

正确使self.number属性更新的方法是使用getter-setter pair以确保self.numberself.cards更改时发生更改。

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

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

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的当前长度。

+0

我现在明白了 - 谢谢你的帮助:) –