トリック(16)、静的メソッド、クラスメソッド、属性メソッド

ディレクトリ

1つの静的メソッド

 1.1。定義

1.2静的メソッドの特徴

1.3まとめ

第二に、クラスメソッド

2.1、定義

2.2、インスタンス変数へのアクセス

2.3。アクセスクラス変数、つまりグローバル属性/静的フィールド 

3、属性メソッド

 3.1。定義

3.2、セッターの使用

3.3削除の使用

4.属性メソッドの適用シナリオ

V.まとめ


1つの静的メソッド

 1.1。定義

クラスのメソッドの前で、@ staticmethodデコレーターを使用して、修飾されたメソッドを静的メソッドに変更できます。

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak():
        print('someone is speaking chinese.')
 
# 静态方法在类中也不需要传入 self参数

1.2静的メソッドの特徴

静的メソッドはインスタンス変数とクラス変数にアクセスできません

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak(self):
        print('%s is speaking chinese.' % self.name)
 
p = Person('Bigberg')
p.speak()
 
 
# 我们在 speak(self) 函数中传入 self

実際、上記のコードは、speakがselfパラメータを必要とすると誤って実行されますが、呼び出されたときに渡されません。そうです、speakが静的メソッドになると、インスタンスによって呼び出されたときに、インスタンス自体をパラメータとして自動的に取得しません。自己に渡されます。  

Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 26, in <module>
    p.speak()
TypeError: speak() missing 1 required positional argument: 'self'

上記のコードを正常に実行するには、2つの方法があります。

1.呼び出すときにインスタンス自体を渡して発声します() 

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak(self):
        print('%s is speaking chinese.' % self.name)
 
p = Person('Bigberg')
p.speak(p)
 
# 输出
 
Bigberg is speaking chinese.

2.メソッドspeakでselfを削除しますが、これはインスタンス内の他の変数をself経由で呼び出すことができないことも意味します。 

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak():                # 方法中已经没有 self 参数了
        print('%s is speaking chinese.' % 'anyone')
 
p = Person('Bigberg')
p.speak()
 
 
#输出
anyone is speaking chinese.

1.3まとめ

通常のメソッドはインスタンス化の直後に呼び出すことができ、インスタンス変数またはクラス変数は自分で呼び出すことができます。メソッドでは、静的メソッドはインスタンス変数またはクラス変数にアクセスできず、インスタンス変数やクラス変数にアクセスできませんこのメソッドは実際にはクラス自体とは何の関係もありませんが、クラスとの唯一の関係は、クラス名で呼び出す必要があることです。

第二に、クラスメソッド

2.1、定義

クラスメソッドは@classmethodデコレータを介して実装されます。クラスメソッドと通常のメソッドの違いは、クラスメソッドはインスタンス変数ではなくクラス変数にしかアクセスできないことです。

2.2、インスタンス変数へのアクセス

インスタンス変数への直接アクセスはエラーを報告し、そのような属性はありません 

class Person(object):
 
    def __init__(self, name, country):
        self.name = name
        self.country = country
 
    @classmethod
    def nationality(self):
        print('Bigberg is %s.' % self.country)
 
p = Person('Bigberg', 'CN')
p.nationality()
 
# 输出
Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 31, in <module>
    p.nationality()
  File "G:/python/untitled/study6/静态方法.py", line 24, in nationality
    print('Bigberg is %s.' % self.country)
AttributeError: type object 'Person' has no attribute 'country'
 
# 提示没有一个 country 属性 

2.3。アクセスクラス変数、つまりグローバル属性/静的フィールド 

class Person(object):
 
    country = 'Chinese'    # 增加一个 全局属性/静态字段
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
 
    @classmethod
    def nationality(cls):    # 这里将sefl 改为 cls
        print('Bigberg is %s.' % cls.country)
 
p = Person('Bigberg', 'CN')
p.nationality()
 
# 输出
Bigberg is Chinese.

3、属性メソッド

 3.1。定義

プロパティメソッドの役割は、@ propertyによってメソッドを静的プロパティに変換することです

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
 
    @property
    def drive(self):
        print('%s is driving a car.' % self.name)


p = Person('Bigberg', 'CN')
p.drive()

# 输出 <br>Traceback (most recent call last): Bigberg is driving a car. File "G:/python/untitled/study6/静态方法.py", line 38, in <module> p.drive() TypeError: 'NoneType' object is not callable
  

この時点で、NoneTypeは呼び出し可能ではないというエラーが発生します。これは、ドライブが現時点で静的プロパティになっているため、メソッドではなく、呼び出すために()記号を追加する必要がないためです。p.driveだけです。通常の通話:

p = Person('Bigberg', 'CN')
p.drive
 
# 输出
 
Bigberg is driving a car.

3.2、セッターの使用

車のブランドなどの属性メソッドでパラメーターを渡す場合は、セッターを使用します。特定の使用法@propertyメソッドname.setter

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
        self.car = "LAMBORGHINI"   # 定义车品牌为兰博基尼
 
    @property
    def drive(self):
        print('%s is driving a %s.' % (self.name, self.car))
 
p = Person('Bigberg', 'CN')
p.drive
 
# 输出
Bigberg is driving a LAMBORGHINI.

 明らかに、私たちが運転した車はランボルギーニでしたが、車のブランドを紹介したいとしたらどうでしょうか。たとえば、テスラ: 

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
        self.car = "LAMBORGHINI"   #当然这里也可以设置为私有属性
 
    @property
    def drive(self):  # 这里不能传参是因为调用的时候,p.drive 没有()了,不能传入
        print('%s is driving a %s.' % (self.name, self.car))
 
    @drive.setter     # 修饰方法drive,可以为属性赋值
    def drive(self, car):     # 我们要重新定义这个drive方法
        print("set car:", car)
        self.car = car
 
p = Person('Bigberg', 'CN')
p.drive = 'Tesla'     # 给属性赋值
p.drive
 
#输出
 
set car: Tesla
Bigberg is driving a Tesla.

3.3削除の使用

属性メソッドを削除するために使用され、特定の使用法@Attribute method name.deleter 

# 以上例
# 我们可以发现普通属性是可以通过del直接删除的
# 比如
print(p.name)
del p.name
print(p.name)
 
# 输出
 
Traceback (most recent call last):
Bigberg
  File "G:/python/untitled/study6/静态方法.py", line 49, in <module>
    print(p.name)
AttributeError: 'Person' object has no attribute 'name'
 
#删除之后就不能再调用了

しかし、del p.driveを使用して属性メソッドを削除することはできません。

del p.drive
 
#输出
Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 51, in <module>
    del p.drive
AttributeError: can't delete attribute

したがって、deleterメソッドを使用します。 

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
        self.car = "LAMBORGHINI"
 
    @property
    def drive(self):
        print('%s is driving a %s.' % (self.name, self.car))
 
    @drive.setter
    def drive(self, car):
        print("set car:", car)
        self.car = car
 
    @drive.deleter   # 修饰 drive 方法,可以删除属性
    def drive(self):   # 重新定义 drive方法
        del self.car    #  删除的是属性
        print("扣了你的车,让你开豪车...")
 
p.drive = 'Tesla'
p.drive
 
del p.drive   
 
# 输出
set car: Tesla
Bigberg is driving a Tesla.
扣了你的车,让你开豪车...

秋明山でもう一度ドライブしましょう...

p.drive
 
# 输出
扣了你的车,让你开豪车...
Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 57, in <module>
    p.drive
  File "G:/python/untitled/study6/静态方法.py", line 28, in drive
    print('%s is driving a %s.' % (self.name, self.car))
AttributeError: 'Person' object has no attribute 'car'
 
# 提示没有这个属性了

4.属性メソッドの適用シナリオ

フライトの到着、遅延、キャンセル、または飛行機の離陸など、フライトの現在のステータスを知りたい場合は、次の手順を実行する必要があります。

1.航空会社のAPIクエリを接続する

2.クエリ結果を分析する 

3.結果をユーザーに返す

したがって、status属性の値は一連のアクションの後に取得された結果であるため、呼び出すたびに、結果を返す前に一連のアクションを実行する必要がありますが、これらのアクションプロセスは、ユーザーが結果を知っている限り、ユーザーが気にする必要はありません。するだけ

class Flight(object):
 
    def __init__(self, name):
        self.name = name
 
    def check_status(self):
        print("checking flight %s status" % self.name)
        return 1
 
    @property
    def flight_status(self):
        status = self.check_status()
        if status == 0:
            print("flight got canceled...")
 
        elif status == 1:
            print("flight is arrived...")
 
        elif status == 2:
            print("flight has departured already...")
 
        else:
            print("cannot confirm the flight status")
 
    @flight_status.setter
    def flight_status(self, status):
        status_dic = {
            0: "canceled",
            1: "arrived",
            2: "departured"
        }
        print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status))
 
    @flight_status.deleter  # 删除
    def flight_status(self):
        print("status got removed...")
 
f = Flight('CA980')
f.flight_status 
f.flight_status = 2
 
#输出
 
checking flight CA980 status
flight is arrived...
Has changed the flight status to  departured

V.まとめ

  1.  静的メソッドはインスタンス変数またはクラス変数にアクセスできません
  2. クラスメソッドと通常のメソッドの違いは、クラスメソッドはインスタンス変数ではなく、クラス変数のみにアクセスできることです。
  3. 属性メソッドはメソッドをクラスの属性に変換し、呼び出すときに()を追加する必要はありません。@ property、@ property method name.setter、@ property method name.deleterの3つの装飾メソッドがあります。
943の元の記事を公開 136のような 330,000以上を訪問

おすすめ

転載: blog.csdn.net/weixin_36670529/article/details/105220807