我在udacity.com上看到了这个例子:
def say_hi():
return 'hi!'
i = 789
class MyClass(object):
i = 5
def prepare(self):
i = 10
self.i = 123
print i
def say_hi(self):
return 'Hi there!'
def say_something(self):
print say_hi()
def say_something_else(self):
print self.say_hi()
输出:
>>> print say_hi()
hi!
>>> print i
789
>>> a = MyClass()
>>> a.say_something()
hi!
>>> a.say_something_else()
Hi there!
>>> print a.i
5
>>> a.prepare()
10
>>> print i
789
>>> print a.i
123
我理解一切,除了a.say_something()
等于hi!
而不是Hi there!
的原因。
这对我来说很奇怪,因为它在调用say_something()
之后会调用类say_hi()
。猜猜我错过了一些重要的事情......
答案 0 :(得分:5)
在封闭范围中查找名称时,不会考虑类范围。您应始终使用self.
限定从类范围获取名称。
有关此行为的详细讨论,请参阅The scope of names defined in class block doesn't extend to the methods' blocks. Why is that?。
答案 1 :(得分:1)
请考虑以下代码:
class X:
def __init__(self, name):
self.name = name
def bound_method(self):
print "I'm bound to", self.name
@staticmethod
def unbound_method():
print "I have no self!"
x = X("Peter")
x.bound_method() # prints: I'm bound to Peter
x.unbound_method() # prints: I have no self!
Python中的类成员和成员函数是绑定到类对象的变量和可调用对象。
这些绑定方法接收它们被调用的对象作为它们的第一个调用参数,通常名为self
。
引用绑定方法和变量需要明确地完成,如x.bound_method()
中所述。因此,对象x
变为第一个函数参数self
。如果要访问其成员,则需要在函数内查询self
。
Python中也有类方法。这是绑定到特定实例化的函数,但对于类是静态的,请参阅unbound_method()
以获取示例。
答案 2 :(得分:0)
这是因为a.say_something()
没有调用类方法(它没有self.
部分所以它调用全局函数)。
答案 3 :(得分:0)
在python中调用内部类方法你应该在方法名称之前写self.
,self.
表示此方法的搜索类,但是当你调用say_hi()
时你不使用self say_something
方法,这导致调用在类外声明的say_hi
函数
写这个解决问题。
def say_something(self):
print self.say_hi()
答案 4 :(得分:0)
它从全局范围而不是类范围调用say_hi
,因为在类范围内,没有say_hi
这样的函数,只有self.say_hi
也许这会有所帮助:
name = 'John'
class Person()
def __init(self)
name = 'Abraham'
def printName(self)
print name
>>>pers = Person()
>>>pers.printName()
'John' #uses global name, rather than Abraham,
# because Abe is not a class instance variavle.
答案 5 :(得分:0)
也许这个例子会更有意义:
def global_scope_hi():
return 'hi!'
class MyClass(object):
def class_scope_hi(object_reference):
return 'Hi there!'
def say_something(object_reference):
print global_scope_hi()
def say_something_else(object_reference):
print object_reference.class_scope_hi()
a = MyClass()
a.say_something()
a.say_something_else()
>>> hi!
>>> Hi there!