0

我从 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()equalshi!和 not Hi there!。这对我来说很奇怪,因为它在之后say_something()调用时调用的是类内部的say_hi()。我想我错过了一些重要的东西..

4

6 回答 6

5

在封闭范围中查找名称时不考虑类范围。您应该始终有资格self.从类范围中获取名称。

请参阅类块中定义的名称范围不会扩展到方法块。这是为什么?有关此行为的更详细讨论。

于 2012-09-15T16:15:37.210 回答
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()示例。

于 2012-09-15T16:38:43.230 回答
0

这是因为a.say_something()不调用类方法(它没有self.部分所以它调用全局函数)。

于 2012-09-15T16:16:23.097 回答
0

在python中调用内部类方法你应该写self.在方法名称之前,self.这意味着搜索这个方法的类,但是当你调用方法时你不使用self,这会导致调用say_hi()在类外声明的函数。 写这个来解决问题。say_somethingsay_hi

def say_something(self):
    print self.say_hi()
于 2012-09-15T16:18:06.613 回答
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 variable.
于 2012-09-15T16:28:04.983 回答
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!
于 2012-09-15T16:42:01.747 回答