web-dev-qa-db-ja.com

Python「self」なしでメソッドを呼び出す

だから私はpythonでプログラミングを始めたばかりで、「自己」の背後にある全体の理由を理解していません。同じクラスの別のメソッドを呼び出すときに使用する必要がある理由がわかりません。既にそのクラスにいる場合、なぜそれを伝える必要があるのですか?

たとえば、次の場合:self.thing()が必要なのはなぜですか?

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"
28
Synaps3

また、クラスstaticでメソッドを作成できるため、selfは不要です。ただし、本当に必要な場合はこれを使用してください。

あなたのもの:

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

静的エディション:

class bla:
    @staticmethod
    def hello():
        bla.thing()

    @staticmethod
    def thing():
        print "hello"
20
Developer

1つの理由は、コードが実行されるクラスのインスタンス特定のメソッドを参照することです。

この例は役立つかもしれません:

def hello():
    print "global hello"

class bla:
    def hello(self):
        self.thing()
        hello()

    def thing(self):
        print "hello"

b = bla()
b.hello()
>>> hello
global hello

今のところ、名前空間の解決と考えることができます。

9

短い答えは、「def thing(args)をグローバル関数として、または別のクラスのメソッドとして使用できるためです。この(恐ろしい)例:

_def thing(args):
    print "Please don't do this."

class foo:
    def thing(self,args):
        print "No, really. Don't ever do this."

class bar:
    def thing(self,args):
        print "This is completely unrelated."
_

これは悪いです。これをしないでください。しかし、didの場合、thing(args)を呼び出すことができ、somethingが発生します。これを適切に計画する場合、これは潜在的に良いことです。

_class Person:
    def bio(self):
        print "I'm a person!"

class Student(Person):
    def bio(self):
        Person.bio(self)
        print "I'm studying %s" % self.major
_

上記のコードは、Studentクラスのオブジェクトを作成してbioを呼び出すと、Personの場合に発生するすべての処理を実行するようにしています。 andと呼ばれる独自のbioを持つクラスは、後で独自の処理を行います。

これは、継承や、まだ見たことがないかもしれない他のいくつかのものになりますが、楽しみにしています。

3
Ali Alkhatib

私にとって、selfはスコープ定義者に似ており、self.foo()およびself.barは、他の場所で定義されたものではなく、クラスで定義された関数とパラメーターを示します。

0

クラスの外部に同じ名前の別の関数が存在する場合があります。 selfはオブジェクト自体へのオブジェクト参照であるため、同じです。 Pythonメソッドは、オブジェクト自体のコンテキストでは呼び出されません。 Pythonのselfは、カスタムオブジェクトモデルなどに対処するために使用できます。

0
D4NI3LS

ミラーはJavaとpython:JavaはJavaを使用せずにクラス内でメソッドを使用できます。メソッドを呼び出す唯一の方法はクラスまたはobjからであるため、これはコンパイラにとって明らかです。これはpythonの翻訳者を混乱させ、実行時に名前空間全体でシンボルテーブルを検索するのにかなりの時間を消費します。 「self」が使用されていない場合、関数呼び出しの潜在的な候補です。この方法を使用すると、python速度はCおよびJavaこれにより、魅力が低下する可能性があります。

0
Jeno