要访问类内部其他位置的这些函数和变量(Python)

时间:2018-07-17 22:35:26

标签: python oop

我正在学习以下课程的指南: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在函数中的关系,因为我无法找出代码对其进行测试

1 个答案:

答案 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}}分别为23)。
  

换句话说,我试图弄清楚self.x在函数中的作用。如果我只在函数中输入x,它会做什么?

平原的x是一个局部变量(如果有的话),是一个全局变量(如果没有)。因此,在y内部,有一个名为x的参数,就是__init__(例如,在x示例中为x)。在2内部,没有任何本地名称为Shape(2, 3)的地方,它将是一个全局变量。但是您可能也没有一个名为area的全局变量,因此它将引发一个x

另一方面,

xNameError的{​​{1}}属性。如上所述,self.xx内的一个新创建的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。