Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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)中的其他位置访问这些函数和变量_Python_Oop - Fatal编程技术网

在类(Python)中的其他位置访问这些函数和变量

在类(Python)中的其他位置访问这些函数和变量,python,oop,Python,Oop,我正在学习以下教程: 我不明白以下几点: 在缩进的第一级上创建的任何函数或变量 也就是说,从一个选项卡开始的代码行位于 put类形状自动放入self。要访问这些 类中其他位置的函数和变量,其名称必须为 前面带有self和句号,例如self.variable\u name 以下是所用示例的一部分: #An example of a class class Shape: def __init__(self,x,y): self.x = x self.y = y

我正在学习以下教程:

我不明白以下几点:

在缩进的第一级上创建的任何函数或变量 也就是说,从一个选项卡开始的代码行位于 put类形状自动放入self。要访问这些 类中其他位置的函数和变量,其名称必须为 前面带有self和句号,例如self.variable\u 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是如何影响代码的_uu_; init __;部分的,但不理解函数,因为它们似乎按照不同的规则运行,例如,我无法从函数内部访问变量。。。换句话说,我试图弄清楚self.x在函数中做了什么。如果我在函数中只放x,它会做什么?如果我将x放入___; int,它只“存在”于__; int中,在生成对象时不能被调用。如果我把self.x放进去,当我创建一个对象时可以调用它。我想知道self.x和函数中的x,因为我无法找到测试它的代码

我理解self.x是如何影响代码的_uu_; init __;部分的,但不理解函数,因为它们似乎按照不同的规则运行,例如,我无法从函数内部访问变量

不,他们真的不按不同的规则玩__init__;只是一个函数,在类定义中定义,与area完全相同

它们都将self作为显式参数,如果想要访问或设置实例属性(如x),或者调用实例方法(如descripe),则必须使用self

唯一的区别是它们的名称:

区域是你直接调用的东西。当您编写my_shape.area时,将调用面积函数,将my_shape作为self的值传递。 __init是Python自动调用的东西。编写my_shape=Shape2,3时,Python构造一个新的shape对象,然后调用uu init_uu函数,将该新对象作为self传递,将2和3作为x和y传递。 换句话说,我试图弄清楚self.x在函数中做了什么。如果我在函数中只放x,它会做什么

如果你有一个普通的旧x是一个局部变量,如果你没有,它是一个全局变量。在uuu init uuuuuuuu中,有一个名为x的参数,它是x,例如,在Shape2,3示例中是2。在区域内部,没有任何局部变量名为x,它将是一个全局变量。但是您可能也没有一个名为x的全局变量,因此它会引发一个NameError

另一方面,self.x是任何self的x属性。如上所述,self是一个新创建的形状实例,位于uuu init_uuuu内,以及您在内部区域上称为area的任何形状实例

如果我将x放入___; int,它只“存在”于__; int中,在生成对象时不能被调用

是的,如果你在uuu init_uuu中定义了一个名为x的东西,它是一个局部变量,所以它只存在于uuu init_uuu中。这对于任何函数都是正确的,不仅仅是_init _;,甚至不仅仅是类中定义的方法;这就是局部变量的含义。一旦函数结束,这些变量就消失了,没有人能够再次访问它们。如果涉及到闭包,这并不完全正确,但是它们不在这里,所以忽略它

我不知道你所说的被调用是什么意思,因为你通常不会调用不是函数/方法/类的值,我也不知道你所说的当我创建一个对象的时候是什么意思,因为创建一个对象的时候正好是调用uu init_u的时候

如果我把self.x放进去,当我创建一个对象时可以调用它

在_uinit_uu内分配给self.x的任何内容都将作为该self实例的一部分存储。因此,拥有该实例的任何人都可以再次访问它。例如,在区域内部,您可以作为self.x访问它。或者,从顶级代码中,您可以将其作为my_shape.x访问

再说一次,这里没有什么特别之处;您可以在另一个方法中执行与descripe方法相同的操作。你甚至可以在物体的外面做

例如:

>>> 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,它与我的_形状是同一个对象,所以我的_形状.x现在是30。

你确定你文章中的缩进也是示例中显示的吗?你的问题在写的时候有一个预览,但是你可能错过了。因为你的问题似乎主要是关于缩进的,而你的例子的缩进显然是错误的,所以很难回答。另外,你能试着改写最后一句话吗?我不知道是什么
它的意思是什么。例如,什么是代码的一部分,而不是函数__init__;是一个函数,就像面积一样;你想做出什么区别?还有,我不能从函数内部访问变量是什么意思?向我们展示你试图编写的代码,以及它是如何不起作用的,或者是如何不按预期/期望工作的。它们更不精确,更容易理解,而不是主动误导,但要注意,当你定义一个类时,没有代码运行,甚至你询问的行,在缩进的第一级上创建的任何函数或变量…都会自动放入self中,但实际上并不是这样写的,因此,如果你试图深入挖掘它们,你会以作者可能并不打算的方式误导自己。非常感谢。你真是太棒了_我想我读了几遍后就明白了:函数外的1 x创建了一个全局变量,而obj不能继承x作为全局变量。函数内部的2 x创建局部变量,obj不能将x作为局部变量继承。3函数外部的self.x创建一个全局变量,对象作为全局变量从其类继承。4 self.x在函数内部创建一个局部变量,对象将其作为局部变量继承。@NeverTellMeTheStack 1和2是正确的,但obj不能继承x是一个奇怪的术语,在这里,您不继承变量。obj类型中的方法可以访问任意一种x,但这两种x都不是对象的一部分。1与整个程序共享,2只是该方法的局部。同时,如果self存在,那么3就没有意义了,您只能在self存在的地方执行self.x,这通常意味着只在它是第一个参数的方法中执行self.x。4是错误的;self.x不创建局部变量,它在self上创建一个属性,与局部变量不同,它可以稍后访问。