ゼロベース入門python 3.7——基礎知識総括(十九)類の方法

4169 ワード

クラスの属性が分類できる以上.では、方法も分類できます.クラスメソッドは、インスタンスメソッドに分割できます.静的メソッドとクラスメソッド.@classmethod装飾を用いた方法をクラスメソッドと呼ぶ.@staticmethodで装飾されたものを静的方法と呼ぶ.何の装飾もしないのを実例方法と呼ぶ.
一.インスタンスメソッド
クラスに定義されたデフォルトのメソッドは、インスタンスメソッドに属します.構造メソッドも含めて特殊なインスタンスメソッドに属します
class Person:
  def __init__(self):
    self.name = "   ",
    self.age = 20,
    self.city = '  '
  def getName(self):
    return self.name
  • インスタンスメソッドの最大の特徴は、selfパラメータを含むことである.このメソッドを呼び出すインスタンスオブジェクトをバインドします.通常、クラスオブジェクトによって
  • が直接呼び出される.
    class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        return self.name
    
    a = Person()
    print(a.name)
    
    ('   ',)
    
  • は、クラス名によってインスタンスメソッドを呼び出すことができる.ただしselfパラメータ
  • を手動でバインドする必要がある
    class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        return self.name
    
    a = Person()
    print(Person.getName(a))
    
    ('   ',)
    
  • クラス名呼び出し時にselfパラメータをバインドしないと異常
  • が放出される.
    class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        return self.name
    
    a = Person()
    print(Person.getName())
    
    Traceback (most recent call last):
      File "/Users/apple/Documents/    /python3/python21.py", line 10, in 
        print(Person.getName())
    TypeError: getName() missing 1 required positional argument: 'self'
  • selfは、1つのパラメータを完全に任意に入力することができる.しかし、selfパラメータにむやみにパラメータを渡すと、プログラムの実行がクラッシュします.
  • class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
    
    a = Person()
    Person.getName("python")
    
      

    クラスのインスタンスオブジェクトでクラスメンバーにアクセスする方法をバインドメソッドと呼び、クラス名でクラスメンバーを呼び出す方法を非バインドメソッドと呼びます.
    二.クラスメソッド
    クラスメソッドはインスタンスメソッドと似ています.少なくとも1つのパラメータを含める必要があります.このパラメータの名前はselfではなくclsであり、pythonはクラス自体がclsに自動的にバインドされると述べ、クラスのインスタンスオブジェクトではないことに注意します.このパラメータも約束されています
    class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
      @classmethod
      def add(cls):
        print("       ")

    @classmethodがない場合はインスタンスメソッドです
  • クラス名を使用してクラスメソッドを直接呼び出すことを推奨する
  • class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
      @classmethod
      def add(cls):
        print("       ")
    
    Person.add()
    
           
    
  • インスタンスオブジェクト呼び出しは使用できますが、
  • は推奨されません.
    class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
      @classmethod
      def add(cls):
        print("       ")
    
    a = Person()
    a.add()
    
           
    

    三.スタティツクメソッド
    静的メソッドは実際には普通の関数です.定義空間が違うだけです.静的メソッドはクラスという空間に定義されています.関数はグローバル関数に定義されており,静的手法にもself,clsのような特殊なパラメータはない.pythonは、クラスまたはオブジェクトをバインドする必要はありません.そのため、クラスメソッドではクラスメソッドやクラスプロパティを呼び出すことはできません.
    class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
      @staticmethod
      def add(name):
        print(name)  
  • クラス名呼び出し
  • class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
      @staticmethod
      def add(name):
        print(name)
    
    
    Person.add("  ")
    
      
    
  • インスタンスオブジェクト呼び出し
  • class Person:
      def __init__(self):
        self.name = "   ",
        self.age = 20,
        self.city = '  '
      def getName(self):
        print("  ")
      @staticmethod
      def add(name):
        print(name)
    
    
    a = Person()
    a.add("  ")
    
      
    

    実際のプログラミングでは、クラスメソッドや静的メソッドはほとんど使用されません.なぜなら、それらの代わりに関数を使用して所望の機能を実現することができるからです.