pythonのクラスのまとめ

4681 ワード

1、クラス内の方法
クラスには主に3つの方法があります.
a、一般メソッド:一般メソッド定義の場合、オブジェクトのインスタンスパラメータが必要であり、クラスで一般メソッドを定義する場合、パラメータselfを転送する必要があります.このパラメータはobjectです.
b、クラスメソッド:クラスメソッドでは、渡されるパラメータはクラス、すなわちclassであり、一般的に使用されるパラメータはclsである
c、静的メソッド:パラメータは必要ありません.静的メソッドでは、関数だけです.静的メソッドを呼び出すときは、パラメータを渡す必要はありません.
クラスの3つの方法のうち、一般的な方法とクラスの方法はいずれもバインドされた方法であり、すなわち、パラメータを伝達する必要があり、一般的な方法はslefに伝達され、クラスの方法はclsに伝達される.
使用するとき、静的メソッドは論理的にclassにバインドされているだけで、クラスメソッドは動的にマッチングすることができ、clas、つまりクラスに伝達されます.
構文上、静的メソッドでは装飾子@staticmethodを使用する必要がありますが、クラスメソッドでは装飾子@classmethodを使用する必要があります.
モジュール関数の使用は、静的メソッドの使用よりも一般的です.
#!/usr/bin/env python

class TestMethod(object):
    def foo(self,x): #         ,     self,       
        print 'excuting foo(%s,%s)' % (self,x)
    @staticmethod #      ,        
    def static_foo(x):
        print 'excuting static_foo(%s)' % x
    @classmethod #     ,         cls
    def class_foo(cls,x):
        print 'excuting class_foo(%s,%s)' % (cls,x)

kel = TestMethod()
kel.foo(1)
kel.static_foo(1)
kel.class_foo(1)
TestMethod.static_foo(1)
TestMethod.class_foo(1)
print (kel.foo)
print (kel.static_foo)
print (kel.class_foo)

実行結果は次のとおりです.
[root@python 422]# python testMethod.py 
excuting foo(<__main__.testmethod object="" at="">,1) #        ,   object
excuting static_foo(1) #          
excuting class_foo(,1) #          
excuting static_foo(1)
excuting class_foo(,1)
> #         ,      self

> #          ,      cls

2、クラスの特殊な属性
クラスにはいくつかの特殊な属性があります.以下に示します.
__name__,クラスの名前を表す
__doc__,クラスのドキュメント文字列
__bases__,クラスのすべての親からなるメタグループ
__dict__,クラスのプロパティ
__module__,クラスが存在するモジュール
__class__,クラス多対用クラス
クラスを使用する方法init__メソッドでは、このメソッドはNoneとして返されます.
#!/usr/bin/env python

class Kel(object):
    def __init__(self):
        print 'this is the init method called'
        return 1

kel = Kel()

上記のコードではinitメソッドで1の値を返します.
実行結果は次のとおりです.
[root@python 422]# python testinitRetun.py 
this is the init method called
Traceback (most recent call last):
  File "testinitRetun.py", line 8, in 
    kel = Kel()
TypeError: __init__() should return None, not 'int'

すなわちinitメソッドでは,値Noneを返さなければならない.
3、方法について_init__
#!/usr/bin/env python

class Kel(object): #    
    def __init__(self):
        print 'Kel class called'
class J(Kel):#J   Kel 
    def __init__(self): #   init  
        print 'J class is called'
class M(Kel):#M  Kel 
    def __init__(self):#   init  
        super(M,self).__init__()#        
        print 'M class is called'
print '-'*10
kel = Kel()
print '-'*10
j = J()
print '-'*10
m = M()

実行結果は次のとおりです.
[root@python 422]# python testinitRetun.py 
----------
Kel class called
----------
J class is called
----------
Kel class called
M class is called

子クラスに独自のinitメソッドが書かれている場合、親クラスのinitメソッドは自動的に呼び出されず、子クラスのinitメソッドでは自分で呼び出さなければならないことがわかります.
各サブクラスは、蓄積されたコンストラクタが呼び出されないように、独自のコンストラクタを構築することが望ましいが、サブクラスがベースクラスのコンストラクタを書き換えると、ベースクラスのコンストラクタは自動的に呼び出されない.
a、ベースクラスのコンストラクタは明示的に書かなければ実行されない
b、selfを渡すインスタンスオブジェクトをベースクラスに呼び出し、上記の例では組み込みメソッドsuperを使用し、superメソッドを使用することが望ましい
superを使用してベースクラスメソッドを呼び出す場合は、ベースクラスメソッドを見つけ、selfパラメータを入力すればよいので、親クラスの名前を明確に指定する必要はなく、変更時にも容易に変更できます.
4、クラスの使用
クラスが定義されると、モジュールとして使用し、他のデータ型や論理実行ストリームと混合してオブジェクトをコードに埋め込むことを目標とします.
クラスの使用方法は2つあります.1つは組み合わせで、1つは派生です.
#!/usr/bin/env python
class Phone(object):
    def __init__(self,ph):
        self.phone = ph

class Person(object):
    def __init__(self,nm,ph):
        self.name = nm
        self.phone = Phone(ph)

p = Person('kel','1234143')
print p.name,p.phone.phone

上記のコードで示すように,クラスPhoneでは携帯電話番号を表し,クラスPersonにはphoneオブジェクトが含まれているので,person has−a phoneを表し,クラスとクラスの関係はhas−aの関係,1つのクラスに他のクラスを含む例を組合せとして表す.
class Person(object):
    def __init__(self,nm,ph):
        self.name = nm
        self.phone = Phone(ph)

class Kel(Person):
    def shout(self):
        pass
        

上記のコードでは、Kelはpersonクラスを継承し、クラスとクラスの関係を派生関係として表します.つまり、同じクラスにはいくつかの異なる機能があり、自分の方法を書くことができます.
サブクラスは、データ属性またはメソッドにかかわらず、ベースクラスの任意の属性を継承できます.
継承で親を上書きできるメソッド--同名の関数を直接使用して上書きできます.いわゆるoverrideメソッドです.
転載先:https://www.cnblogs.com/kellyseeme/p/5525039.html