Python 3.x Python初学者w/a基本问题:如何正确调用类和方法?
我刚刚介绍了类、对象和多态性以及如何创建它们。但我很难理解类中的语法以及如何调用对象。我将举例说明其中一个练习: 定义一个名为Shape的类及其子类Square。Square类有一个init函数,该函数以长度作为参数。这两个类都有一个面积函数,可以打印默认情况下形状面积为0的形状面积 提供的解决方案如下:Python 3.x Python初学者w/a基本问题:如何正确调用类和方法?,python-3.x,class,Python 3.x,Class,我刚刚介绍了类、对象和多态性以及如何创建它们。但我很难理解类中的语法以及如何调用对象。我将举例说明其中一个练习: 定义一个名为Shape的类及其子类Square。Square类有一个init函数,该函数以长度作为参数。这两个类都有一个面积函数,可以打印默认情况下形状面积为0的形状面积 提供的解决方案如下: class Shape(object): def __init__(self): pass def area(self): return 0
class Shape(object):
def __init__(self):
pass
def area(self):
return 0
class Square(Shape):
def __init__(self, l):
Shape.__init__(self)
self.length = l
def area(self):
return self.length*self.length
aSquare = Square(3)
print (aSquare.area())
问题1:这个街区真让我困惑
class Square(Shape):
def __init__(self, l):
Shape.__init__(self)
self.length = l
我知道通过包含(Shape)
我们继承了它的方法。但是为什么使用变量l
而不仅仅是length
?编辑:当我将l
替换为length
时,它输出name错误:名称“l”未定义
问题2:为什么Shape
用在Shape.\uu_____(self)
?出于某种原因,我想写self.\uuuu init\uuuu(self)
,但这显然是错误的。我运行过的大多数示例都创建了一个对象,然后调用方法object.method()
。但这是一整节课。我可以回溯代码,这对代码的工作方式很有意义。但是我不理解self
的基本目的和功能,以及X
的语法在X中是如何工作的
非常感谢你一直以来的帮助。我对这个冗长的问题感到非常抱歉。我很难分辨到底是什么让我感觉不舒服,但我希望我说得有道理 您的第一个问题与类的\uuuu init\uuu
方法有关。在python中,无论何时从类实例化对象,都将调用init。当你打电话的时候
b = Square(3)
Python创建了一个新的Square对象,其长度变量是\uuu init\uu
函数的第二个参数,将被初始化为3。在\uuuu init\uuuu
的定义中
def __init__(self, length):
self.length = length
第一个参数是Square类的对象,第二个参数是length参数。如果将length重命名为l,则需要在所有位置重命名它
def __init__(self, l):
self.length = l
关于第二个问题,请阅读有关继承的内容。基本上,您的二级正方形是从一级形状继承而来的。在\uuuu init\uuu
方法中,它调用第一类形状的\uuuuu init\uuu
。你可以替换
Shape.__init__(self)
与
Q1:l
是Square构造函数的一个参数,它被分配给Square的实例变量length
self
表示类的实例(在本例中为正方形)aSquare=Square(3)
,aSquare
实际上是self
,l
是3
,然后l
被分配给self.length
,也就是aSquare.length=3
。如果你做打印(aSquare.length)
你会得到3
l
可以被命名为任何有效的名称,甚至length
本身
问题2:由于Square
继承自Shape
,因此必须调用Shape的
构造函数才能初始化自身,因此行Shape.\uuuuu init\uuuuu(self)
实际上调用的是Shape的
构造函数,也就是它的def\uuuu init\uuuuuuuuuuuuuuuu(self)
方法。如前所述,self
表示类的实例。您可以看到该实例方法都有self
参数,但是在调用该方法时,您没有在该位置传递任何参数。查看area
方法的定义及其调用方式
def area(self):
return self.length*self.length
aSquare.area()
区域
需要参数,但没有提供参数。因为它是隐含的,因为aSquare表示自我
。你本可以换个方式来做的。从类中调用区域
,并提供aSquare
作为参数
Square.area(aSquare)
但是如果你做了Square.area()
你会得到一个错误。那么self.length
可以是self.anything
?在解决方案中,他们使用了(self,l)
,但随后等同于self.length=l
。基本上,length
不是l
,但它仍然有效。怎么样?@Aisyncself.length
表示长度是正方形对象的属性。您可以用任何名称调用属性,但它将由所有类型为Square的对象共享。如果定义obj=Square(3)
,则obj.length
将等于3。在init函数中,如果将属性的名称更改为其他名称,例如self.side
,则obj.side
是新属性的名称l
只是一个函数参数,它可以有任何名称。类似地,self
只是Python中调用类对象的约定。您可以给它任何名称,只要它是方法的第一个参数。非常感谢。澄清一下,Shape的
构造函数为什么要传递给Square<代码>形状
似乎什么都不想做?最后,area
需要参数是什么意思?如果我理解正确,area
正在使用Sqaure的length
属性?您已经澄清了很多,非常感谢。定义函数时,括号内的所有内容都称为参数。调用函数时,必须在参数处提供参数。当定义区域
时,有self
参数,这意味着类的实例。很抱歉搞混了,我的意思是为什么正方形
甚至会继承形状
的功能?计算所需面积的目的是什么?Shape的
构造函数在Square
内部调用,因为Square
继承自Shape
。通过继承Shape
它继承其所有成员(字段和方法),因此
Square.area(aSquare)