2016-08-12 126 views
0

我的问题是为什么我无法让类的对象给它一个整数作为参数。它完全忽视了我作为参数传递给它的价值。然而,如果我从类中调用区域函数并将相同数字传递到它的括号中,它将输出所需的结果144.为什么这个类的方法没有这个参数?

从我目前阅读的内容中,我最好的猜测是类函数的方式是编码是不正确的,我希望它会实现。我是否需要将区域函数看作如下参数:self.length

# -*- coding: utf-8 -*- 
class square: 
    sides = 4 
    def __init__(self, length): 
     self.length = length 
    def area(self, length): 
     return length * length 

box = square(12) 
print(box.area()) 

输出:TypeError: area() missing 1 required positional argument: 'length'

不应该被保存所赋予它为对象的生活的持续时间值创建的对象?为什么当我告诉它如果打电话看起来像这样再次从area方法打印时会抛出另一个错误?

print(box.area(12)) 
output:144 
print(box.area()) 
output: <bound method square_shape.area of <__main__.square_shape object at 0x7f5f88355b70>> 

我很抱歉,如果这个问题是一个有点古怪的措辞,但我只是在寻找尽可能多的信息,我可以得到,并试图更好地了解我在做什么这里。关于这个问题的其他问题并没有很好地理解我想要弄清楚什么。

回答

4

你在考虑self.length。长度(前面没有“自我”)只是一个局部变量。如果它是一个论点,你需要提供它。

你可能想要的是: def area(self): return self.length * self.length

+0

所以,如果我的理解正确,那么长度是这个对象的局部变量,我做某事的方式是以某种方式将它视为一个全局变量? – Ragecoder

+0

也许吧?如果你正在考虑它,那么你当前的术语是关闭的。长度是一个实例字段。还有一个长度局部变量。 “局部变量”是指本身的作用域。一旦区域完成并返回一个值,则不再定义作为局部变量的“长度”。但是self.length,只要你处理这个对象的特定实例,实例字段就会保持它的值。 –

+0

你先生是个巧妙的人。你能否评论一下,以自我为参数的功能究竟是如何导致这种巫术的?当它通过自我时,它是否将创建对象时传递的所有参数传递给区域函数? – Ragecoder

1

area采取self说法,这足以访问self.length

... 
def area(self): 
    return self.length * self.length 

然后就可以调用square(3).area()并获得9

您当前的声明需要明确的长度参数,类似square(3).area(4)这将产生16

一个OOP的关键原则之一是方法访问对象(或常说实例的)状态,并且可以在该状态下工作,而不是传递明确。

在Python中,通常使用参数self将相关对象传递给方法。 area方法在squarelength上运行;您以self.length的身份访问它。那selfsquare的一个实例,例如square(3)返回。