我遵循来自http://sthurlow.com/python/lesson08/的教程:
我不明白以下几点:
在第一层缩进上创建的任何函数或变量(即,在我们放置类形状的位置右侧开始一个制表符的代码行将自动放入self中。要在类中的其他位置访问这些函数和变量,它们的名称必须以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在函数中的区别,因为我找不出测试它的代码
发布于 2018-07-18 07:04:55
我理解self.x如何影响__ init __部分代码,但不是函数,因为它们似乎遵循不同的规则(例如,我不能从函数内部访问变量)……
不,他们真的不遵守不同的规则。__init__
只是一个在class
定义中定义的函数,与area
完全一样。
它们都将self
作为显式参数,如果要访问或设置实例属性(如x
)或调用实例方法(如describe
),则必须使用该self
。
唯一不同的是它们的名称:
area
是可以直接调用的东西。当您编写my_shape.area()
时,它会调用area
函数,并将my_shape
作为Python的值自动调用。当您编写my_shape = Shape(2, 3)
时,Python将构造一个新的Shape
对象,然后调用__init__
函数,将该新对象作为self
传递(将2
和3
作为x
和Python传递换句话说,我试图弄清楚
在函数中做了什么。如果我只把x放在函数中,它会做什么?
普通老式x
是一个局部变量,如果没有,就是一个全局变量。因此,在__init__
中,有一个名为x
的参数,它就是那个x
(例如,在Shape(2, 3)
示例中它是2
)。在area
中,没有任何名为x
的局部变量,它将是一个全局变量。但是您可能也没有名为x
的全局变量,因此它将引发一个NameError
。
另一方面,self.x
是任何self
的x
属性。如上所述,self
是__init__
中新创建的Shape
实例,以及您在area
中调用area
的任何Shape
实例。
如果我把x放在__ int中,它只‘活’在__ int中,不能在我创建对象时被调用。
是的,如果您在__init__
中定义了一个名为x
的东西,那么它是一个局部变量,所以它只存在于__init__
中。这适用于任何函数-不仅仅是__init__
,甚至不只是类中定义的方法;这就是局部变量的含义。一旦函数结束,这些变量就消失了,再也没有人能访问它们。(如果涉及闭包,情况就不是这样了,但是它们不在这里,所以忽略它。)
我不知道您所说的“调用”是什么意思,因为您通常不会调用不是函数/方法/类的值,我也不知道您所说的“当我创建一个对象时”是什么意思,因为当您创建一个对象时正是__init__
被调用的时候。
如果我把self.x放在__int中,当我创建一个对象时就可以调用它。
您在__init__
中分配给self.x
的任何内容都将存储为该self
实例的一部分。因此,拥有该实例的任何人都可以再次访问该实例。例如,在area
中,您可以作为self.x
访问它。或者,从顶级代码中,您可以作为my_shape.x
访问它。
同样,这里关于__init__
没有什么特别之处;您可以在另一个方法中做同样的事情-就像describe
方法一样。您甚至可以从对象外部执行此操作。
例如:
>>> my_shape = Shape(2, 3)
>>> my_shape.x
2
>>> my_shape.area()
6
>>> my_shape.x = 4
>>> my_shape.area()
12
再说一次,我不知道你说的“被调用”或者“当我做一个对象时”是什么意思。
我想知道self.x和x在函数中的区别,因为我找不出测试它的代码
尝试添加此方法:
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
确实永久地改变了self
,它和my_shape
是同一个对象,所以my_shape.x
现在30岁了。
https://stackoverflow.com/questions/51391079
复制相似问题