类属性不能正常工作(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
如何实现的信息。