Pythonの基本:クラス

意味:

  • 同じ特性や動作を共有するもののグループの総称。
  • これはメソッドとプロパティのカプセル化 (コレクション) です。
  • クラス定義を入力すると、新しい名前空間が作成され、ローカル スコープとして使用されます。したがって、ローカル変数へのすべての割り当ては、この新しい名前空間内で行われます。具体的には、関数定義は、このローカル スコープ内の新しい関数名にバインドされます。
  • Python の定義では、名前の最初の文字が大文字になります。

クラスに含まれるプロパティとメソッド

クラス属性/クラス メソッド:
クラス名の下にある代入ステートメントを使用して定義され、通常はこのクラスに関連する機能を記録するために使用されます。このクラス
のすべてのオブジェクトによって共有され、1 つのコピーのみがメモリに保存されます。
クラス名 [クラス名] を通じて直接アクセスされます。 .プロパティ名] /メソッド名]

インスタンス属性/メソッド:
インスタンス属性はオブジェクトごとに保存され、インスタンス メソッドはメモリにのみ保存されます
オブジェクト名 [オブジェクト名.プロパティ名/メソッド名] によるアクセス

オブジェクトの属性は、別のクラスによって作成されたオブジェクトにすることができます。属性を定義するときにどの初期値を設定すればよいかわからない場合は、それを None に設定できます。

プライベート タイプの属性/メソッド オブジェクト
内の一部の属性は、内部でのみ使用されることを目的としており、外部からアクセスすることを目的としていません (つまり、object.properties/methods を通じてアクセスすることはできません)。また、サブクラスからはアクセスできません。
属性/メソッドの前に 2 つのアンダースコアを追加すると、プライベート属性/メソッドが定義されます。たとえば、self.__age
dir 組み込み関数: dir (オブジェクト/識別子) は、オブジェクト内のすべての属性とメソッドを表示できます。

保護されたタイプの属性/メソッド。
単一のアンダースコアで始まる変数またはメソッドは、それ自体とサブクラスからのみアクセスできます。
モジュール import * からインポートすることはできません。

クラス内のメソッドは、実際には少し特殊な関数です (メソッドの最初のパラメーターは self である必要があります)。メソッド呼び出しは (self. またはインスタンス オブジェクト名を介して) 特定のオブジェクトにバインドする必要がありますが、関数はバインドされません。する必要がある

サブクラスと親クラス

サブクラスが親クラスの属性またはメソッドにアクセスするときは、親クラスをモジュールにインポートする必要があります。そうしないと、作成されたサブクラス オブジェクトにエラーが発生します。 Super(サブクラス名 [現在のクラス], self).__ init __
( ): 継承された親のクラス属性が初期化されます。
[親クラス名。__ init __ (self、parameter) を使用して親クラスの属性を初期化することもできます。単一継承では両者に大きな違いはありませんが、多重継承ではこのメソッドはリソースを浪費します]

親クラスからの継承時にサブクラスが初期化されない場合、サブクラスは親クラスのプロパティを自動的に継承します。サブクラスが
親クラスの継承時に初期化を行うが、親のコンストラクターを初期化するスーパー メソッドを呼び出さない場合は、サブクラスは親クラスのプロパティを自動的に継承します。プロパティ 親クラス
から継承するときにサブクラスが初期化され、スーパー メソッドを呼び出して親クラスのコンストラクターを初期化すると、サブクラスは親クラスのプロパティを継承します。

サブクラスが親クラスのメソッドをオーバーライドする場合は、次の 2 つの状況があります。

  1. 親クラスのメソッドのオーバーライド (ポリモーフィズム)
  2. 親クラスのメソッドを展開 (継承) します。親クラスによって元々カプセル化されたメソッドは、子クラスのメソッドの一部です。

実装手順:
1. サブクラスが親クラス メソッドを書き換える
2. 必要に応じてスーパー親クラス メソッドの実行コードを使用する
3. 特定の要件に対応する拡張コードを他の場所に書き込む

魔法の方法

Pythonで前後の二重アンダースコアで定義したメソッドは自分で呼び出すことができます。これらのメソッドは、特定の条件下で実行するようにトリガーされます
__ new __():
新しいオブジェクトを作成して返すメソッドで、新しいインスタンスの生成プロセスを制御するために使用されます。
メモリ内のオブジェクトにメモリ領域を割り当て、への参照を返します。オブジェクト。オブジェクトの作成時に呼び出される最初のメソッドは __init () メソッド
よりも優れており、 init __() メソッドはオブジェクトの作成後にいくつかの属性を追加するメソッドです。

class Foo():
	def __new__(cls,*args,**kwargs):
		return object.__new__(cls,*args,**kwargs)
#cls指的是当前类,如果传入别的类,则返回别的类对象
#args  kwargs后续将传入到__init__中进行初始化
#new方法必须有返回值,才会执行相应的init方法,返回值正是其中的self

機能:
インスタンス化プロセスを制御し
、シングルトンを実装します。

def __new__(cls,value):
	return Super().__new__(cls,abs(value))
#abs会将传如到init中的值提前进行处理

__init__():
初期化 (コンストラクター) 関数。初期化作業を実行するために使用されます。

__ del __():
デストラクター。オブジェクトが破棄される前に自動的に呼び出されます。このメソッドの呼び出しは、ライフ サイクルの終了を示します。

__ 項目別 __():

クラスをシーケンス化し、スライスやトラバーサル操作を実現します。生成されたオブジェクトは反復関数を持ちます (反復可能なオブジェクトになります)。
このメソッドは、インスタンス オブジェクトが P[] 操作を実行するか、for ループを使用して実行するときに自動的に呼び出されます。インスタンス オブジェクトを走査します。for
...in... を使用してオブジェクトを反復する場合、オブジェクトが __iter__、__next__ イテレーター プロトコルを実装していない場合、Python インタープリターはオブジェクトを反復するために __getitem__ を探します。このメソッドが接続されている場合は、どちらも定義されていない場合、インタープリタはエラーを報告します。

__ call__():
クラスのインスタンス オブジェクトを関数のように呼び出すことができます。このメソッドがクラスに実装されている場合、インスタンス オブジェクトは呼び出し可能なオブジェクトになります [() はそれ自体に適用され、通常は関数を使用して実行できます、クラスなど】

object = Testcall("name")
object()  《------》 object.__call__()

__dict __():

クラス (インスタンス オブジェクト) 内のすべての属性名と属性値で構成される辞書を表示します。クラス名について
、print(class name.__dict__) を呼び出すと、親クラスまたはサブクラスに関係なく、独自の属性のみが返されます。
オブジェクト呼び出しの場合は、辞書メソッドを使用できます。その属性値を次のように変更します: object. __dict __[name]=“a”

__dir__():
オブジェクトが所有するすべてのプロパティとメソッドを表示します

print(对象.__dir__())
print(dir(对象)

__レン__():

オブジェクト (シーケンス) の長さ (つまり、要素の数) を確認し、
同時に __getitem__ メソッドと __len__ メソッドを実装すると、それはシーケンスとみなされます。

__repr__():
印刷時の出力コンテンツをカスタマイズします (オブジェクト)。このメソッドは文字列を返す必要があります。

その他の一般的に使用される関数/メソッド
クラスに属性またはメソッドがあるかどうかを判断する 3 つの主なメソッド: hasattr getattr setattr
まず、クラスはインスタンスの属性を持つことはできないが、インスタンスはクラスの属性とメソッドを使用できることを宣言します。

クラスメソッド/静的メソッド/特殊メソッド

1. クラスメソッド @classmethod インスタンス
化されたオブジェクトとは関係なく、クラス内の属性メソッドを直接操作したい場合は、クラスメソッドを使用できます。原則として、クラス メソッドは、クラス自体をオブジェクトとして操作するメソッドです。
クラス メソッドは、クラス名を通じて直接呼び出されるメソッドです。クラス メソッドには、少なくとも 1 つのパラメータが必要です。最初のパラメータはデフォルトで cls です。 。

class A:
    name = "barry"

    def func(self):
        print(self)

    @classmethod
    def func2(cls):
        # 这里的 cls 指的就是类本身
        # 而上面的 self 指的是实例化对象
        print(cls)
        print(777)
a = A()
# 实例化对象调用类的普通方法
a.func()
# 运行结果:
<__main__.A object at 0x7f310784d3c8>

2. 静的メソッド @staticmethod
静的メソッドはクラス内の関数であり、インスタンスを必要としません。主に、論理的にクラスに属する論理コードを格納するために使用されますが、クラス自体とは何の関係もありません。
静的メソッドには、クラスおよびインスタンス化されたオブジェクトの属性やメソッドは含まれません。

class A:

    name = "barry"

    @staticmethod
    def func():
        print(666)

a = A()
A.func()        # 666
a.func()        # 666

3. クラスの特殊メソッド @property は
メソッドをプロパティとして偽装しますが、ロジックは変わりません。

class A:

    def __init__(self, username, password):
        self.__username = username
        self.__password = password

    @property
    def name(self):
        return self.__username

a1 = A("Jane", 123)
print(a1.name)      # Jane

その他よく使われる機能

1.hasattr() 関数は、
インスタンス オブジェクトに指定された名前の属性またはメソッドが含まれているかどうかを判断するために使用されます。

hasattr(obj.name)
out:
True / False

2.getattr() 関数は、
インスタンス オブジェクトによって指定された属性/メソッドを取得します。

getattr(obj,name[,default])

入力名が属性の場合は、対応する値が返されます。メソッド名の場合は、メソッドのステータス情報が返されます。
検索が失敗した場合は、デフォルトのパラメータdefaultが返されます。デフォルトが設定されていない場合、プログラムはレポートを返します。
指定された属性名がオブジェクト メソッドの場合、関数オブジェクトが返されます指定されたメソッド func() がインスタンス関数である場合、 getattr(A, 'func')() を記述することはできないことに注意してください。 fun() がインスタンス関数である場合、クラス A オブジェクトで呼び出すことができないためです。 getattr(A(), 'func')(); のように記述する必要があります。


3.対応する属性/メソッドを変更または追加するsetattr() 関数

setattr(obj.name,value)

存在する場合は変更し、存在しない場合は追加します。

4.issubclass(cls, class_or_tuple) 関数は
、クラス (cls) が後続のクラスであるか、タプルに含まれる複数のクラスのサブクラスであるかを確認します。

issubclass(str, (list,tuple))
issubclass(str,object)

out:
False
True

5.isinstance(obj, class_or_tuple) は
、obj が後者のクラスのオブジェクトであるか、タプルに含まれる複数のクラスのいずれかのオブジェクトであるかをチェックし、戻り値は bool 型です。

isinstance([10],(list,tuple))
isinstance("hello",str)

out:
True
True

参考リンク:
1. https://blog.csdn.net/qq_39314932/article/details/80716295

おすすめ

転載: blog.csdn.net/qq_44804542/article/details/116692006