理解Python中的空间

时间:2016-03-30 18:02:26

标签: python

我是Python的初学者。我知道空间在编译中起着重要作用。所以我在同一个python脚本文件中有以下两个类:

class ClassA:
  def __init__(self):
     self.x = {}
  def _methodA1():
    # Something
  def _methodA2():
    # Something

class ClassB:
  def _methodB1():
    # Something
  def _methodB2():
    # Something

def MethodX():
  print "Hello World"

(1)哪个班级MethodX属于哪个?

(2)我们可以说ClassBClassA的内部类吗?

(3)如果MethodX属于ClassA,是否可以通过self.x访问MethodX

4 个答案:

答案 0 :(得分:8)

  1. MethodX不属于任何类,它是一个全局函数,而不是其中一个类的方法
  2. 不,因为ClassAClassB的缩进相同;内部类ClassA将匹配ClassA
  3. 中方法定义的缩进
  4. 由于它不属于任何类,MethodX无法直接访问任何实例的属性。除此之外,必须明确接受self作为方法的第一个位置参数;由于MethodX不接受self,因此无法访问它。因此,你所有的方法都被打破了;除非用@staticmethod修饰,否则它们需要至少接受一个位置参数(按常规方法在常规方法上称为self,在cls s上按约定称为@classmethod)。

答案 1 :(得分:2)

是的,空间对python很重要,用于块和语句的缩进级别是这些语句的范围是如何建立的。

MethodX不是一种顶级函数,与对象实例无关或通过类调用。

ClassB不是ClassA的内部类。你可以在python中嵌套类,因为类引入了另一个块范围,它嵌套了,但这样做很不寻常,它没有带来很多好处,并且它使一些作用域行为看起来更混乱(即在封闭类范围内引用类属性)

MethodX无法通过self访问ClassA.x,因为它不在ClassA的范围内。此外,您必须将self声明为python中的显式参数 - 对象实例的引用会自动作为方法的第一个参数传递,但不会自动为其创建绑定。实际上self是一种约定,而不是一种正式的关键字。 _methodA1_methodA2确实有方法范围,因为它们是在ClassA的范围内定义的,但它们没有声明自我绑定

答案 2 :(得分:1)

  1. MethodX不属于A类或B类。

  2. ClassB不是"内部" ClassB类。

  3. 不相关,因为事实并非如此。

答案 3 :(得分:0)

使用相同缩进的内容通常位于相同的“级别”(unindented =“文件级别”)。

缩进的块“属于”它之前的第一个语句,缩进比它小。

示例:

class A:         # "file level"
    def b(self): # "belongs to" class A
        if True: # "belongs to" b
            pass # "belongs to" the if

def x(): # "file level"
    pass # "belongs to" x
    pass # same as above