解析python類方法、対象方法、静的方法


pythonにおける静的方法の実現とクラスの方法はすべてpythonの修飾器に依存して実現される。オブジェクト法にはselfパラメータがあり、クラス法にはclsパラメータがあり、静的方法にはこれらの追加パラメータは必要ない。
1、クラス/オブジェクトが関数のような方法を持つことができることについて議論しました。これらのオブジェクト方法と関数の違いは、付加的なself変数だけです。

# -*- coding:utf-8 -*-
#!/usr/bin/python
# Filename: method.py

class Person:
grade=1
def __init__(self,name):
self.name = name
def sayHi(self):# self       
print 'Hello, your name is?',self.name

@staticmethod #    ,       ;                  
def sayName():#       ,      self
print "my name is king"#,grade,#self.name

@classmethod #   
def classMethod(cls):
print("class method")

p = Person("king")
p.sayHi()
p.sayName()
p.classMethod()
Person.classMethod()
出力:
ハロー、your name is?キング
my name is king
class method
class method
2、静的方法
クラスで静的な方法を使用するには、クラスのメンバー関数の前に@staticmethodタグを付けて、下のメンバー関数が静的な関数であることを表します。静的方法を使用する利点は、インスタンスを定義する必要がなくてもこの方法を使用できることである。さらに、複数の例がこの静的方法を共有する。
静的方法は、このクラスに属する方法を書く必要がある場合がありますが、これらのコードは、インスタンスオブジェクト自体には全く使用されません。

class Student(object):
 @staticmethod
 def aver_age(x, y):
  return x + y

 def year(self):
  return self.aver_age(self.month, self.day)
この例では、averをageは非静的方法としても動作可能であるが、selfパラメータを提供したいが、このパラメータは方法では全く使用されない。ここで@staticmethod装飾器は、Studentオブジェクトのインスタンスの初期化のためのバインディング方法を必要としなくてもいいです。バインディング方法は同じオブジェクトですが、作成にはコストがかかります。静的方法はこれらを避けることができます。

Student().year is Student().year
Student().aver_age is Student().aver_age
Student().aver_age is Student.aver_age
False
True
True
読み取り可能性の高いコードです。@staticmethodを見ると、この方法はオブジェクト自身の状態に依存する必要がないことが分かります。
サブクラスでカバーできます。aver_モジュールのトップ関数として、Studentからサブクラスを引き継ぐと、Studentのaver_は変更できません。yearを上書きしないと。
3、種類の方法
クラスの方法は普通のメンバー関数と静関数とは違っています。接触言語でもこのような意味を見たことがないようです。その定義を見てください。
クラスの方法は、クラスまたはその例によって呼び出すことができる方法であり、クラスに関係なく、この方法を呼び出すか、またはクラスのインスタンスに関係なく、この方法を呼び出すことができ、この方法の最初のパラメータは、常にこの方法のクラスのオブジェクトを定義する。
覚えてください。方法の最初のパラメータは、インスタンスオブジェクトではなくクラスオブジェクトです。
慣例によれば、クラスの方法の最初のモジュラスは、clsと名付けられています。クラスの方法をいつでも定義する必要はありません。(クラスの方法で実現できる機能は、普通の関数を定義することによって実現できます。この関数はクラスのオブジェクトをパラメータとして受け入れるだけでいいです。)

class Dog(object):
 food = "gutou"
 age = "1"
 def __init__(self, name):
  self.NAME = name
 @classmethod
 def eat(self,age): #        
  # print(self.NAME)
  print(age)
  print(self.food)

 @classmethod
 def eat1(self, age): #         
  # print(self.NAME)
  age = "2"
  self.food = "tang"
 @staticmethod
 def print_1():
  print(Dog.food, Dog.age)

d = Dog("labuladuo")
d.eat(Dog.age) #      
Dog.eat(Dog.age) #     
print("-----1-----")
d.eat1(Dog.age)
Dog.print_1()
print("--------2-------")
Dog.eat1(Dog.age)
Dog.print_1()
出力:
1
グトー
1
グトー
-----1-----
('tang','1')
------------2----
('tang','1')
以上はpython類の方法、対象の方法、静的な方法の詳しい内容を解析します。python類の方法、対象の方法、静的な方法に関する資料は他の関連記事に注目してください。