[Python]クラスとオブジェクト

 

目次

オブジェクト指向プログラミング

カプセル化(情報シールド)

継承(サブクラスが親クラスを自動的に共有する方法)

ポリモーフィズム

クラス関連の知識

自己

建設と破壊

__init __(self、param1、param2 ...)

__new __(cls、...)[めったに使用されない]

プライベート変数

継承

Pythonは多重継承をサポートしています

組み合わせ

クラス定義、クラスオブジェクト、インスタンスオブジェクト

練る

クラスデルを破壊する

クラス関連の組み込みメソッド

issubclass(classA、classB)

isinstance(obj、class)

hasattr(オブジェクト、名前)

getattr(obj、name [、default])

setattr(obj、name、value)

delattr(obj、name)

property(fget = None、fset = None、fdel = None、doc = None)

総括する


Object = attribute + method

class Student:
    #属性
    color = 'green'
    weight = 10
    legs = 2
    shell = True
    mouth = '小嘴'

    #方法
    def climb(self):
        print('爬?')
    def run(self):
        print('跑a a a a a ')
    def walk(self):
        print('优雅~')

オブジェクト指向プログラミング

カプセル化(情報シールド)

継承(サブクラスが親クラスを自動的に共有する方法)

ポリモーフィズム

リトルタートルの先生は、より深いレベルでポリモーフィズムを理解しています。シャングリのクラスAとBの両方に親クラスはありませんが、親クラスがあり、親クラスに楽しいメソッドがあり、クラスAとBの両方がオーバーロードしていると想定できます。同じ親クラスと同じメソッドを表現する楽しいメソッドは異なる結果をもたらし、これはポリモーフィズムです。ポリモーフィズムは、実際には、トラ、鳥、サルはすべてクリーチャー(「クリーチャー」という名前の同じ親クラスから継承)であり、クリーチャーにはサバイバルスキルの「エスケープ」メソッドがありますが、トラ、鳥、サルはそれぞれです。エスケープメソッドは異なります。[同じ親クラス、同じメソッドシグネチャ、ただしメソッドの実際の効果が異なる]のこれらのケースはポリモーフィックです。宇宙の観測者として、トラ、鳥、猿が同時に逃げるのを見たが、逃げ道が異なり、「とても速く走り、それぞれが違う〜」と叫んだとします。

クラス関連の知識

自己

Selfは、thisポインター(現在のコンテキストオブジェクト)と同等です。各メソッドの最初のパラメーターはselfに固定されています。メソッドが呼び出されると、デフォルトで最初のパラメーターselfがメソッド自体に渡され、2番目のパラメーターが渡されます。メソッド自体に直接。

建設と破壊

__init __(self、param1、param2 ...)

初期化方法

__init__メソッドはNoneを返す必要があります。そうでない場合、エラーが報告されます

__new __(cls、...)[めったに使用されない]

工法は?__new__は__init__の前に実行され、clsオブジェクト(スペースがメモリによって開かれた後に取得されるオブジェクト)および関連する必須パラメーターを渡す必要があります。たとえば、次のstrクラスでは、文字列パラメーターを渡す必要があります。

上部の栗は継承された不変型strに属していますが、事前に内容を変更する必要があります具体的には、最初にstrクラスを継承し、次に__new__を書き換え、最初に着信文字列を大文字に変換し、次にstrクラスの__new__メソッドを実行し続け、その戻り値を返します。

 

プライベート変数

__nameはプライベート変数、変数名のプレフィックスは二重アンダースコア '__'、すべてプライベート変数、それ以外の場合はパブリック変数(ps:プライベートメソッドはパブリックメソッドで操作できます)

_class name__変数名を使用してアクセスできます。次に例を示します。

継承

import random as r

class Fish:
    def __init__(self):
        self.x = r.randint(0,10)
        self.y = r.randint(0,10)

    def move(self):
        self.x -= 1
        print("我的位置是:", self.x, self.y)

class GoldFish(Fish):
    pass

class Carp(Fish):
    pass

class Salmon(Fish):
    pass

class Shark(Fish):
    def __init__(self):
        self.hungry = True

    def eat(self):
        if self.hungry:
            print("饿饿!!!!!!饿!!!!!!")
            self.hungry = False
        else:
            print("太撑了 吃不下咯!")

sharkの構築メソッドは、親クラスの構築メソッドをカバーしているため、x変数が初期化されず、moveメソッドで算術演算エラーが報告されます。これは、次の2つのメソッドに変更することで解決できます。

推奨される方法

親クラスは1つのステップで変更できるため、親クラスのメソッドコードを呼び出す必要はありません。たとえば、FishをFishAに変更する場合、以下で推奨されていないメソッドのFish .__ init __(self)をFishA .__ init __(self)に変更する必要があります。

class Shark(Fish):
    def __init__(self):
        super().__init__()
        self.isHungry = True

    def eat(self):
        if self.isHungry:
            print("饿饿!!!!!!饿!!!!!!")
            self.isHungry = False
        else:
            print("太撑了 吃不下咯!")

推奨されない方法

class Shark(Fish):
    def __init__(self):
        Fish.__init__(self) #新增一句代码,调用父类构造方法初始化x
        self.hungry = True

    def eat(self):
        if self.hungry:
            print("饿饿!!!!!!饿!!!!!!")
            self.hungry = False
        else:
            print("太撑了 吃不下咯!")

Pythonは多重継承をサポートしています

予測できないバグが発生する可能性があるため、多重継承を使用することはお勧めしません。

組み合わせ

class Turtle:
    def __init__(self,x):
        self.num = x

class Fish:
    def __init__(self,x):
        self.num = x

class Pool:
    def __init__(self, x, y):
        self.turtle = Turtle(x)
        self.fish = Fish(y)

    def print_num(self):
        print("水池有乌龟%s只,鱼%d条!" % (self.turtle.num, self.fish.num))

クラス定義、クラスオブジェクト、インスタンスオブジェクト

  • クラス定義は静的であり、クラスオブジェクトとインスタンスオブジェクトは動的です
  • delを使用してクラス定義破棄した後も、既存のクラスオブジェクトとインスタンスオブジェクトは正常に機能できますが、オブジェクトをクラス定義から再度インスタンス化することはできません。
  • クラス定義()インスタンスはクラスオブジェクトから出てきます。クラスオブジェクトのメンバーが変更されると、インスタンスオブジェクトになります。
  • [クラスオブジェクトのメンバー]から[クラス。メンバー名]までは影響しますが、[インスタンスオブジェクトのメンバー]には影響しません。

以下は私の個人的な推測です、あなたが知っているなら私に知らせてください

栗では、C.count + = 100の後、インスタンスオブジェクトaとbの数が影響を受けるのに、cインスタンスオブジェクトが影響を受けない理由を理解するのは難しくありません。観察により、c.countが変更され、c.countがC.countの影響を受けず(Cはクラスであり、クラスオブジェクトでもある)、aとbの他の2つのカウントは変更されていないことがわかります。したがって、クラスオブジェクトCの影響を受けますか?

C#の文字列の不変性に少し似ています。たとえば、a、b、cが最初にインスタンス化されるとき、それらはすべて同じ初期状態のインスタンスオブジェクトを指します。cのメンバーが変更されると、cは新しいインスタンスを指します。 C.countのオブジェクトは、C.countによって変更された初期状態のインスタンスオブジェクトです。つまり、aとbが指すインスタンスオブジェクトであり、cは当然影響を受けません。【確認、疑問点①】

栗では、変更されたcxは元のcxメソッドを上書きし、int型変数になります。

練る

Pythonでは、メソッドを呼び出す前にインスタンスが必要です。この制限は、実際にはPythonのいわゆるバインディングの概念です。

栗では、selfはBのprintBメソッドにバインドされていません(つまり、メソッドの最初のパラメーターはselfではありません)

__dict__属性にアクセスすると、インスタンスオブジェクトまたはクラスのメンバーディクショナリを表示できます。

クラスデルを破壊する

delメソッドを使用して破棄する

栗では、Cクラスを破棄して、新しいCクラスオブジェクトを作成できませんが、cオブジェクトは引き続き正常に使用できます。

クラス関連の組み込みメソッド

issubclass(classA、classB)

classAがclassBのサブクラスであるかどうかを判断し、Trueを返す場合は、Falseを返します。

isinstance(obj、class)

objがクラスのオブジェクトであるかどうかを判別する

objがタプルのクラスオブジェクトの1つに属している限り、クラスはクラスタプルにすることもできます。Trueを返します。

hasattr(オブジェクト、名前)

オブジェクトに属性があるかどうかを判別します

getattr(obj、name [、default])

オブジェクトの属性を取得します

setattr(obj、name、value)

オブジェクト属性に値を割り当てます。属性がない場合は、新しい属性割り当てが作成されます

delattr(obj、name)

オブジェクト内の属性を削除します。注:存在しない場合は、例外AttributeErrorが発生します。削除する前に存在を確認できます。

property(fget = None、fset = None、fdel = None、doc = None)

property(...)は、プロパティに関連する3つのメソッド(get、modify、delete)をxプロパティにバインドし、xプロパティはサイズを直接操作します。例:c1.x = 18はc1.setSize(と同等) 18)他の操作は同じです。

総括する

おすすめ

転載: blog.csdn.net/qq_39574690/article/details/111561470