在python中打印对象的实例

时间:2015-10-30 19:36:28

标签: python python-2.7

我是一名蟒蛇学习者。为什么这段代码不能打印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

4 个答案:

答案 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)