ホームページ >バックエンド開発 >Python チュートリアル >Pythonのクラスと型を詳しく解説

Pythonのクラスと型を詳しく解説

高洛峰
高洛峰オリジナル
2017-03-07 16:41:521467ブラウズ

クラスとは

は、カテゴリまたはタイプの同義語と見なすことができます。すべてのオブジェクトは特定のクラスに属しており、そのクラスのインスタンスと呼ばれます。

例: Bird は「鳥」の一例です。これは、多くのサブクラスを持つ単なる一般的な (抽象) クラスです。あなたが見ている鳥は、サブクラス「ヒバリ」に属している可能性があります。 「鳥」はすべての鳥の集合であり、「ヒバリ」はその一部であると考えてください。オブジェクトが属するクラスが別のオブジェクトが属するクラスのサブセットである場合、前者は後者のサブクラスと呼ばれます。したがって、「ヒバリ」は「鳥」のサブクラスとなり、「鳥」は「ヒバリ」「鳥」になります。 "のスーパークラス

サブクラスの定義は、さらにメソッドを定義するプロセスです

クラスの作成

>>> class Person:
    def setName(self,name):
        self.name=name
    def getName(self):
        return self.name
    def greet(self):
        print "Hello,world! I'm %s" % self.name

        
>>> foo=Person()
>>> bar=Person()
>>> foo.setName('Nsds')
>>> bar.setName('Ysdy')
>>> foo.greet()
Hello,world! I'm Nsds
>>> bar.greet()
Hello,world! I'm Ysdy

fooのsetName関数とgreet関数を呼び出すと、fooは自動的にそれ自体を最初の関数として配置します。関数に渡されるため、self という名前が付けられます。 self がないと、メンバー メソッドはプロパティを操作するオブジェクト自体にアクセスできません。プロパティは外部からアクセスできます。機能。メソッドは最初のパラメータを対応するインスタンスにバインドするため、このパラメータを指定する必要はありません。したがって、プロパティを通常の関数にバインドできるため、特別な self パラメーターはありません:

(特性はオブジェクト内の変数であり、オブジェクトの状態はそのプロパティによって記述され、オブジェクトのメソッドはその機能を変更できます。機能はオブジェクトの外部から直接アクセスできます)

>>> foo.name
'Nsds'
>>> bar.name='Yoda'
>>> bar.greet()
Hello,world! I'm Yoda

変数birdsong参照はメソッドbird.singにバインドされていますか、それともselfパラメータへのアクセスですか(クラスの同じインスタンスにバインドされたままです)

>>> class Class:
    def method(self):
        print 'I have a self!'

        
>>> def function():
    print "I don't..."

>>> s=Class()
>>> s.method()
I have a self!
>>> s.method=function
>>> s.method()
I don't...

メソッドまたは機能をプライベート (外部からアクセスできない) にするには、名前の前に二重アンダースコアを置きます

>>> class Bird:
    song='Squaawk'
    def sing(self):
        print self.song

        
>>> bird=Bird()
>>> bird.sing()
Squaawk
>>> birdsong=bird.sing
>>> birdsong()
Squaawk

クラスの内部定義では、二重アンダースコアで始まる名前はすべて "単一のアンダースコアと前にクラス名を付けた形式です

>>> class Secretive:
    def __inaccessible(self):
        print "Bet you can't see me..."
    def accessible(self):
        print "The secret message is:"
        self.__inaccessible()

        
>>> s=Secretive()
>>> s.__inacessible()

Traceback (most recent call last):
  File "<pyshell#182>", line 1, in <module>
    s.__inacessible()
AttributeError: &#39;Secretive&#39; object has no attribute &#39;__inacessible&#39;
>>> s.accessible()
The secret message is:
Bet you can&#39;t see me...

クラスの名前空間

クラスを定義するとき、クラスステートメントにあるすべてのコードは特別な名前空間で実行されます---クラスの名前空間。この名前空間には、クラスのすべてのメンバーがアクセスできます。

クラスの定義は実際には実行コードブロックです

>>> Secretive._Secretive__inaccessible<unbound method Secretive.__inaccessible>
>>> s._Secretive__inaccessible()
Bet you can&#39;t see me...

新しいメンバーの値はm1の特性に書き込まれ、クラススコープ内の変数を保護します

スーパークラス

>>> class MemberCounter:
    members=0
    def init(self):
        MemberCounter.members+=1

        
>>> m1=MemberCounter()
>>> m1.init()
>>> m1.members
>>> m1.members=2
>>> m1.members
>>> m2=MemberCounter()
>>> m2.init()
>>> m2.members
>>> m2.init()
>>> m2.members
>>> m1.members
>>>

継承、スーパークラス

>>> class Filter:
    def init(self):
        self.blocked=[]
    def filter(self,sequence):
        return [x for x in sequence if x not in self.blocked]

    
>>> class SPAMFilter(Filter):
    def init(self):
        self.blocked=[&#39;SPAM&#39;]

        
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]
>>> s=SPAMFilter()
>>> s.init()
>>> s.filter([&#39;SPAM&#39;,&#39;SPAM&#39;,&#39;egg&#39;,&#39;name&#39;,&#39;ff&#39;])
[&#39;egg&#39;, &#39;name&#39;, &#39;ff&#39;]

複数のスーパークラス

最初に継承されるクラスのメソッドは、後で継承されるクラスのメソッドをオーバーライドします

>>> class Filter:
    def init(self):
        self.blockes=[]
    def filter(self,sequence):
        return [x for x in sequence if x not in self.blocked]

    
>>> class S(Filter):
    def init(self):
        self.blocked=[&#39;s&#39;]

        
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])

の詳細な説明については、関連記事をご覧ください。 Python のクラスと型については、PHP 中国語 Web サイトに従ってください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。