我正在学习以下课程的指南:http://sthurlow.com/python/lesson08/
我不理解以下内容:
在缩进的第一级创建的任何函数或变量 (也就是说,代码行从我们右边的一个TAB开始 put类Shape将自动放入自身。要访问这些 类内其他地方的函数和变量,它们的名称必须为 前面加上self和句号(例如self.variable_name)。
以下是所使用示例的一部分:
#An example of a class
class Shape:
def __init__(self,x,y):
self.x = x
self.y = y
description = "This shape has not been described yet"
author = "Nobody has claimed to make this shape yet"
def area(self):
return self.x * self.y
def perimeter(self):
return 2 * self.x + 2 * self.y
def describe(self,text):
self.description = text
我了解self.x如何影响代码的__init __部分,但对函数没有影响,因为它们似乎遵循不同的规则(例如,我无法从内部函数访问变量)...换句话说,我试图弄清楚self.x在函数中的作用。如果我仅在函数中输入x,它会做什么?如果我将x放在__ int __中,则它仅存在于__ int中,并且在创建对象时无法调用。如果将self.x放在__int中,则可以在创建对象时调用它。我想知道self.x与x在函数中的关系,因为我无法找出代码对其进行测试
答案 0 :(得分:1)
我了解self.x如何影响代码的__init __部分,但对函数没有影响,因为它们似乎遵循不同的规则(例如,我无法从内部函数访问变量)...
不,他们确实没有遵守不同的规则。 __init__
只是一个在class
定义中定义的函数,与area
完全一样。
它们都使用self
作为显式参数,并且如果要访问或设置self
之类的实例属性,或者调用{{1}之类的实例方法,则必须使用x
}}。
唯一的区别是它们的称呼方式:
describe
是您直接调用的东西。当您编写area
时,它将调用my_shape.area()
函数,并将area
作为my_shape
的值。self
是Python自动调用的东西。当您编写__init__
时,Python会构造一个新的my_shape = Shape(2, 3)
对象,然后调用Shape
函数,并将该新对象作为__init__
(以及self
和{{ 1}}分别为2
和3
)。换句话说,我试图弄清楚self.x在函数中的作用。如果我只在函数中输入x,它会做什么?
平原的x
是一个局部变量(如果有的话),是一个全局变量(如果没有)。因此,在y
内部,有一个名为x
的参数,就是__init__
(例如,在x
示例中为x
)。在2
内部,没有任何本地名称为Shape(2, 3)
的地方,它将是一个全局变量。但是您可能也没有一个名为area
的全局变量,因此它将引发一个x
。
x
是NameError
的{{1}}属性。如上所述,self.x
是x
内的一个新创建的self
实例,以及您在self
内调用Shape
的任何__init__
实例。
如果我将x放在__ int __中,则它仅“存在”于__ int且在创建对象时无法调用。
是的,如果您在Shape
中定义了名为area
的名称,则它是一个局部变量,因此它仅存在于area
中。这对于 any 函数是正确的-不仅是x
,甚至不是类中定义的方法。这就是局部变量的含义。函数结束后,这些变量就消失了,没有人可以再次访问它们。 (如果涉及到闭包,则并非如此,但是它们不在此处,因此请忽略它。)
我不知道“被叫”是什么意思,因为您通常不调用不是函数/方法/类的值,并且我也不知道“当我创建对象时的意思” ”,因为创建对象的时间恰好是调用__init__
的时间。
如果将self.x放在__int中,则可以在创建对象时调用它。
您在__init__
内分配给__init__
的所有内容都存储为该__init__
实例的一部分。因此,拥有该实例的任何人都可以再次访问它。例如,在self.x
内部,您可以以__init__
的身份访问它。或者,您可以从顶级代码中以self
的身份访问它。
同样,这里area
没什么特别的;您可以使用另一种方法做同样的事情-与self.x
方法一样。您甚至可以从对象外部进行操作。
例如:
my_shape.x
再次,我不知道您所说的“被叫”或“当我制造物体时”是什么意思。
我想知道self.x与x在函数中的关系,因为我无法找出代码对其进行测试
尝试添加此方法:
__init__
然后尝试:
describe
您会看到它可以更改>>> my_shape = Shape(2, 3)
>>> my_shape.x
2
>>> my_shape.area()
6
>>> my_shape.x = 4
>>> my_shape.area()
12
和def play_with_x(self):
x = 10
print(x)
print(self.x)
x = 20
print(x)
print(self.x)
self.x = 30
print(x)
print(self.x)
。它们彼此完全独立,但是大多数似乎在一个功能内起着相同的作用。但是现在:
>>> x = 0
>>> my_shape = Shape(2, 3)
>>> my_shape.play_with_x()
该x
对全局变量self.x
没有任何作用。但是>>> x
0
>>> my_shape.x
30
确实永久更改了x = 20
,它与x
是同一对象,所以self.x = 30
现在是30。