Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python初学者w/a基本问题:如何正确调用类和方法?_Python 3.x_Class - Fatal编程技术网

Python 3.x Python初学者w/a基本问题:如何正确调用类和方法?

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

我刚刚介绍了类、对象和多态性以及如何创建它们。但我很难理解类中的语法以及如何调用对象。我将举例说明其中一个练习:

定义一个名为Shape的类及其子类Square。Square类有一个init函数,该函数以长度作为参数。这两个类都有一个面积函数,可以打印默认情况下形状面积为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
,但它仍然有效。怎么样?@Aisync
self.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)