Python OOP:3つのオブジェクト指向機能(カプセル化、継承、多態性)、クラス属性とインスタンス属性、クラスメソッド@ classmethod、静的メソッド@staticmethod

1つは、オブジェクト指向の3つの特徴です。

ここに画像の説明を挿入

二、ポリモーフィズム

ここに画像の説明を挿入
定義:ポリモーフィズムはオブジェクトを使用する方法です。サブクラスはクラスメソッドをオーバーライドし、異なるサブクラスオブジェクトの同じクラスメソッドを呼び出します。これにより、異なる実行結果が生成される可能性があります。

親クラスは複数のサブクラスに継承でき、異なるサブクラスごとに複数のオブジェクトを作成でき、各オブジェクトは親クラスの親クラスのメソッドを呼び出して異なる実行結果を生成できます。

# 犬与人协同工作,人协同不同的犬执行不同的任务
class Dog:
    def work(self):   # ⽗类提供统⼀的⽅法,哪怕是空⽅法
        print("指哪打哪")

class ArmyDog(Dog):  # 继承Dog类
    def work(self):  # ⼦类重写⽗类同名⽅法
        print("追击敌人")

class DrugDog(Dog):
    def work(self):  # ⼦类重写⽗类同名⽅法
        print("追查毒品")

class Person:
    def work_with_dog(self, dogtype):  # 传⼊不同的对象,执⾏不同的代码,即不同的work函数
        dogtype.work()

ad = ArmyDog()
dd = DrugDog()
p1 = Person()

ad.work()  # 追击敌人
p1.work_with_dog(ad)  # 追击敌人
p1.work_with_dog(dd)  # 追查毒品

3つ、クラス属性を設定してアクセスする

-クラスプロパティはオブジェクトクラス属性によって所有され、クラスオブジェクトクラス属性のすべてのインスタンスが共有されます。

-クラス属性には、クラスオブジェクトまたはインスタンスオブジェクトを使用してアクセスできます。
ここに画像の説明を挿入

class Dog:
    age = 3

wangcai = Dog()
xiaohei = Dog()

print(Dog.age)  # 通过类访问类属性
print(wangcai.age)  # 通过对象访问类属性
print(xiaohei.age)  # 通过对象访问类属性

输出:
3
3
3

第四に、クラス属性を変更します

クラス属性は、インスタンスオブジェクトではなく、クラスオブジェクトを介してのみ変更できます。クラス属性がインスタンスオブジェクトを介して変更される場合は、インスタンス属性が作成されることを意味します。

class Dog:
    age = 3

wangcai = Dog()
xiaohei = Dog()

Dog.age = 10  # 通过类修改类属性
print(Dog.age)  # 10 通过类访问类属性
print(wangcai.age)  # 10 通过对象访问类属性
print(xiaohei.age)  # 10 通过对象访问类属性
class Dog:
    age = 3

wangcai = Dog()
xiaohei = Dog()

wangcai.age = 20  # 通过对象修改类属性,实际并未修改类属性,而是创建了一个同名实例属性
print(Dog.age)  # 3 通过类访问类属性
print(wangcai.age)  # 20 通过对象访问类属性
print(xiaohei.age)  # 3 通过对象访问类属性

5つのインスタンス属性

クラスを介してインスタンス属性にアクセスすることはできません。

  • 各オブジェクトの各属性は個別のメモリスペースを占有します。多数のインスタンス属性が定義されている場合、メモリが消費されます。
  • 値が変更されない一部のプロパティは、クラスプロパティとして定義できます。クラスプロパティはメモリの共有を共有するため、メモリ消費を削減できます。
  • パラメータを渡す必要がない場合は、静的メソッドを定義してメモリ消費をさらに削減できます。
class Dog:
    def __init__(self):
        self.age = 5

    def printinfo(self):
        print(self.age)
        
wangcai = Dog()
print(wangcai.age)  # 对象访问实例属性
wangcai.printinfo()  # 对象访问实例方法
print(Dog.age)  # 报错:实例属性不能通过类访问

ここに画像の説明を挿入

6、クラスメソッド

1.クラスメソッドの特徴

  • 最初のパラメータはクラスオブジェクトのメソッドです
  • デコレータ@classmethodを使用して、クラスメソッドとしてマークする必要があります。クラスメソッドの場合、最初のパラメータはクラスオブジェクトである必要があります。通常、最初のパラメータとしてclsが使用され、clsはこのクラスを表します。

@classmethod、クラスメソッドの識別の関数
`

2.クラスメソッドの使用シナリオ

  • ときの方法は、クラスオブジェクトを使用する必要があります(など、プライベートクラス属性へのアクセスなど)を、クラスメソッドを定義します
  • クラスメソッドは通常、クラス属性と組み合わせて使用​​されます
class Dog:
    __age = 3  #  添加私有类属性,两道下划线.属性名=属性值

    @classmethod    # 定义类方法
    def get_age(cls):  # 形参cls代表Dog类(在实例属性里用形参self代表实例对象)
        return cls.__age  # 访问类属性的值
    
wangcai = Dog()
result = wangcai.get_age()  # 对象调用类方法
print(result)  # 3
print(Dog.get_age())  # 3 类调用类方法

7つの静的メソッド

1.静的メソッドの特徴

  • これは、飾られる必要があるデコレータ@staticmethod静的メソッドは、クラスオブジェクトやインスタンスオブジェクトを(仮パラメータは、自己/ CLSを持っていない)渡す必要はありません
  • 静的メソッドは、オブジェクトアクセスとクラスアクセスの両方を使用できます

2.静的メソッドの使用シナリオ

  • メソッドがインスタンスオブジェクト(インスタンスオブジェクト、インスタンス属性など)もクラスオブジェクト(クラス属性、クラスメソッド、インスタンスの作成など)も使用する必要がない場合は、静的メソッドを定義できます。
  • 不要なパラメータ転送をキャンセルすると、不要なメモリ使用量とパフォーマンス消費を減らすことができます。
class Dog:
    @staticmethod
    def printinfo():
        print("这是一个犬类,用于创建犬实例……")

wangcai = Dog()
wangcai.printinfo()  # 通过对象调用类方法
Dog.printinfo()  # 通过类调用类方法

输出:
这是一个犬类,用于创建犬实例……
这是一个犬类,用于创建犬实例……

8.まとめ

ここに画像の説明を挿入

PS:ソース、itheima

おすすめ

転載: blog.csdn.net/weixin_47008635/article/details/114748867