我是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)我们可以说ClassB
是ClassA
的内部类吗?
(3)如果MethodX
属于ClassA,是否可以通过self.x
访问MethodX
?
答案 0 :(得分:8)
MethodX
不属于任何类,它是一个全局函数,而不是其中一个类的方法ClassA
和ClassB
的缩进相同;内部类ClassA
将匹配ClassA
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)
MethodX不属于A类或B类。
ClassB不是"内部" ClassB类。
不相关,因为事实并非如此。
答案 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