ホームページ > バックエンド開発 > Python チュートリアル > Python のインスタンス メソッド、静的メソッド、クラス メソッド、クラス変数、インスタンス変数の簡単な分析

Python のインスタンス メソッド、静的メソッド、クラス メソッド、クラス変数、インスタンス変数の簡単な分析

WBOY
リリース: 2016-06-16 08:44:16
オリジナル
1233 人が閲覧しました

注: Python2.7 が使用されます。

1. インスタンスメソッド

インスタンス メソッドは、クラスのインスタンスによって使用できるメソッドです。次のように:

コードをコピーします コードは次のとおりです:

class Foo:
def __init__(self, name ):
Self.name = 名前
DEF HI (Self):
PRINT SELF.NAME

if __name__ == '__main__':
foo01 = Foo('letian')
foo01.hi()
print type(Foo)
print type(foo01)
print id(foo01)
print id(Foo)


実行結果は次のとおりです:
コードをコピーコードは次のとおりです:

letian


40124704
31323448[code]
ご覧のとおり、 Foo の型は classobj (クラス オブジェクト。Python で定義されたクラス自体もオブジェクトです)、foo01 の型はインスタンスです。また、hi() はインスタンス メソッドなので、foo01.hi() は 'letian' を出力します。インスタンス メソッドの最初のパラメータはデフォルトで self になり、インスタンスを参照します。 「自己」はキーワードではなく、合意された書き方です。 init() は、インスタンスの生成時にデフォルトで呼び出されるインスタンス メソッドです。 Foo の定義を次の形式に変更します:
[code]class Foo:
def __init__(this, name):
this.name = name
def hi(here):
print here.name
は引き続き正常に動作します。 組み込み関数 ID は、オブジェクトの識別子を表示するために使用されます。そのドキュメントの内容は次のとおりです:
コードをコピーします コードは次のとおりです。

> ;>> print id.__doc__
id(object) -> オブジェクトの ID を返します。これは、同時に存在するオブジェクト間で一意であることが保証されます (ヒント: これはオブジェクトのメモリ アドレスです。)


2. 静的メソッド

静的メソッドは、クラス定義の名前空間にある通常の関数であり、どのインスタンス型でも動作しません。静的メソッドを定義するには、デコレータ @staticmethod を使用します。クラス オブジェクトとインスタンスの両方で静的メソッドを呼び出すことができます:


コードをコピー コードは次のとおりです:class Foo:
def __init__ (self, name):
self.name = name
def hi(self):
print self.name
@staticmethod
def add(a, b):
a + b を印刷

if __name__ == '__main__': foo01 = Foo('letian')

foo01.hi()
foo01.add(1,2)
Foo.add(1, 2)

実行結果は次のとおりです。



コードをコピーします コードは次のとおりです:letian
3
3

多くのプログラミング言語では、インスタンスによる静的メソッドの呼び出しが許可されていないことに注意してください。
3. クラスメソッド

クラスメソッドは、クラス自体をオブジェクトとして操作するメソッドです。クラス メソッドは @classmethod デコレータを使用して定義され、その最初のパラメータはクラスであり、規則は cls として記述されます。クラス オブジェクトとインスタンスの両方でクラス メソッドを呼び出すことができます:


コードをコピー コードは次のとおりです:class Foo:
name = 'letian '
@classmethod
def hi(cls, x):
print cls.name * x

if __name__ == '__main__': foo01 = Foo()

foo01.hi(2)
Foo.hi(3)

実行結果は次のとおりです。



コードをコピーします コードは次のとおりです:letian letian
letian letian letian

インスタンスがクラス メソッドを呼び出すことを許可されていないプログラミング言語は他にも多数あることに注意してください。
4.超

super は、親クラスで関数を実行するために使用されます。例:


コードをコピー コードは次のとおりです: class Foo( object):
def hi(self):
print 'hi,Foo'

class Foo2(Foo): def hi(self):

super(Foo2, self).hi()

if __name__ == '__main__':

foo2 = Foo2()

foo2.hi()

実行結果:



コードをコピー コードは次のとおりです: こんにちは、Foo

注意,Foo类必须继承某个类(并且这个继承链开始于object类),否则会报错。如果改成下面的形式:
复制代码 代码如下:

class Foo:
    def hi(self):
        print 'hi,Foo'

class Foo2(Foo):
    def hi(self):
        super(Foo2, self).hi()

if __name__ == '__main__':
    foo2 = Foo2()
    foo2.hi()


运行时报错如下:
复制代码 代码如下:

......
TypeError: must be type, not classobj
关于super,具体请见http://docs.python.org/2/library/functions.html?highlight=super#super以及super.doc。


五、类变量和实例变量

类变量定义在类的定义之后,实例变量则是以为self.开头。例如:

复制代码 代码如下:

class Foo(object):
    val = 0
    def __init__(self):
        self.val = 1

if __name__ == '__main__':
    foo = Foo()
    print foo.val
    print Foo.val


运行结果为:
复制代码 代码如下:

1
0
实例也能够访问类变量,如下:
复制代码 代码如下:

class Foo(object):
    val = 0
    def __init__(self):
        pass
if __name__ == '__main__':
    foo = Foo()
    print foo.val
    print Foo.val
运行结果如下:
复制代码 代码如下:

0
0
另外,可以通过以下方式访问类变量:
复制代码 代码如下:

class Foo(object):
    val = 3
    def __init__(self):
        print self.__class__.val
if __name__ == '__main__':
    foo = Foo()
运行结果:
复制代码 代码如下:

3
还可以这样:
复制代码 代码如下:

class Foo(object):
    val = 3
    def __init__(self):
        pass
    @classmethod
    def echo(cls):
        print cls.val
if __name__ == '__main__':
    Foo.echo()
运行结果:
复制代码 代码如下:

3

六、如何调用父类的构造函数

子类(派生类)并不会自动调用父类(基类)的init方法,例如:

复制代码 代码如下:

class Foo(object):
    def __init__(self):
        self.val = 1

class Foo2(Foo):
    def __init__(self):
        print self.val

if __name__ == '__main__':
    foo2 = Foo2()


运行时报错。

调用父类的init方法有两种,第一种:

复制代码 代码如下:

class Foo(object):
    def __init__(self):
        self.val = 1

class Foo2(Foo):
    def __init__(self):
        Foo.__init__(self)
        print self.val

if __name__ == '__main__':
    foo2 = Foo2()


第二种:
复制代码 代码如下:

class Foo(object):
    def __init__(self):
        self.val = 1

class Foo2(Foo):
def __init__(self):
super(Foo2,self).__init__()
print self.val

if __name__ == '__main__':
foo2 = Foo2()


両方のメソッドの結果は次のとおりです:
コードをコピー コードは次のとおりです:

1
ただし、これら 2 つのメソッドには違いがあります。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート