我是一名蟒蛇学习者。为什么这段代码不能打印100?
class Pet(object):
def __init__(self):
self.name = ''
self.age = 0
def getName(self, newname):
self.name = newname
return self.name
def getAge(self, aging):
self.age += aging
return self.age
polly = Pet()
polly.getAge(100)
print polly.getAge
答案 0 :(得分:5)
1)您的意思是print polly.getAge()
而不是print polly.getAge
。
2)然而,您有第二个问题(getAge()
要求aging
是强制性的,完全不应该这样做。您可以使用print polly.getAge(0)
对其进行修改,或者正确修复,请参阅下文。
回到1)前者实际调用函数/方法(它试图调用它,除了2的问题)) 后者是错误的,它只打印有关实际函数/方法的信息,但实际上并没有调用它。
您可以通过查看type(polly.getAge())
(或type(polly.getAge(0))
)是int,与type(polly.getAge)
不同来探索更多内容,这将是函数/方法的某种类型。
2)这里的第二个问题是getAge(...)
假装是一个getter函数,但它也有一个强制参数aging
并正在实现老化,这被认为是“方法滥用” 并且违反了关注点的分离,或者至少没有将其命名为getX
,这实际上是为getter保留的。您的替代方案是a)给它一个默认的getAge(self, aging=0)
(或者使用@property装饰器),现在它在调用getAge()
时就像一个getter。或者b)将两个独立的功能部分重构为单独的方法(“关注点分离”):
class Pet(object):
...
def getAge(self, aging):
return self.age
def doAging(self, aging):
self.age += aging
# Note that doAging() has no return value, and that is correct behavior (it's a method, not a getter)
总的来说,这是一种更好,更易于维护的设计,我们对具有副作用的“魔法吸气剂/安装者”皱眉,原因很多(其中一个原因是它们是单位测试的###)。当你开始添加更多方法时,你会很快看到原因......
答案 1 :(得分:5)
一步一步。
polly = Pet() # initialize a new Pet
polly.getAge(100) # add 100 to polly.age
print polly.getAge # print the getAge method bound to polly
你可能意味着做什么
polly = Pet()
polly.getAge(100)
print polly.age
或者:
polly = Pet()
print polly.getAge(100)
无论如何,你应该很好,不要用getX
方法改变值。这绝对是出乎意料的行为。
答案 2 :(得分:3)
你真的应该有一种设定和获得年龄的方法。
\s
答案 3 :(得分:0)
这是修改后的代码。我希望这会对你有所帮助。
class Pet:
## def __init__(self):
## self.name = ''
## self.age = 0
def setAge(self, age):
self.age = age
#return self.age
def getAge(self):
## self.age = aging
## return self.age
print self.age
polly = Pet()
polly.setAge(100)
polly.getAge()
#print (polly.getAge)