理解Python中的“自我”

时间:2012-09-15 16:10:53

标签: python oop python-2.7 self

我在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()。猜猜我错过了一些重要的事情......

6 个答案:

答案 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!