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

クラススコープ内には、のような関数はなく、のみsay_hiであるため、クラススコープではなくグローバルスコープから呼び出しています。say_hiself.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 に答える
0

a.say_something()クラスメソッドを呼んでいないからです(部品がないself.のでグローバル関数を呼んでいます)。

于 2012-09-15T16:16:23.097 に答える
0

self.Pythonでメソッド名の前に記述する必要がある内部クラス メソッドを呼び出すには、このメソッドのクラスを検索することを意味しますが、メソッドでself.呼び出すときに self を使用しないため、クラスの外部で宣言された関数が呼び出されます。 これを書いて問題を解決してください。say_hi()say_somethingsay_hi

def say_something(self):
    print self.say_hi()
于 2012-09-15T16:18:06.613 に答える