Pythonでよく使われるクラスのいくつかの方法を紹介します

5282 ワード

組み込み方法の説明
 __init__(self,...) オブジェクトを初期化し、新しいオブジェクトを作成するときに呼び出す
 __del__(self)オブジェクトを解放し、オブジェクトが削除される前に呼び出す
 __new__(cls,*args,**kwd)インスタンスの生成操作
 __str__(self)print文の使用時に呼び出される
 __getitem__(self,key)シーケンスのインデックスkeyに対応する値を取得し、seq[key]に等価である
 __len__(self)インライン関数len()の呼び出し時に呼び出される
 __cmp__(stc,dst)2つのオブジェクトのsrcとdstの比較
 __getattr__(s,name)属性の値を取得する
 __setattr__(s,name,value)属性の値を設定する
 __delattr__(s,name)name属性を削除
 __getattribute__() __getattribute__()機能と_getattr__()類似
 __gt__(self,other)selfオブジェクトがotherオブジェクトより大きいか否かを判断する
 __lt__(slef,other)selfオブジェクトがotherオブジェクトより小さいか否かを判断する
 __ge__(slef,other)selfオブジェクトがotherオブジェクトより大きいか否かを判断する
 __le__(slef,other)selfオブジェクトがotherオブジェクトより小さいか否かを判断する
 __eq__(slef,other)selfオブジェクトがotherオブジェクトに等しいか否かを判断する
 __call__(self,*args)インスタンスオブジェクトを関数として呼び出す
__init__():
__init__メソッドは、クラスのオブジェクトが作成されると、すぐに実行されます.この方法は、あなたのオブジェクトを初期化するために使用することができます.この名前の開始と終了は二重下線であることに注意してください.
コード例:

#!/usr/bin/python
# Filename: class_init.py
class Person:
  def __init__(self, name):
    self.name = name
  def sayHi(self):
    print 'Hello, my name is', self.name
p = Person('Swaroop')
p.sayHi()

出力:

Hello, my name is Swaroop

 
説明:_init__メソッドは、パラメータname(および通常のパラメータself)を取得するように定義されます.ここで_init__では、nameと呼ばれる新しいドメインを作成するだけです.同じ名前を持つにもかかわらず、2つの異なる変数であることに注意してください.ポイントは私たちにそれらを区別することができます.最も重要なのは、特別に呼び出していないことです.init__メソッドは、クラスの新しいインスタンスを作成するときに、パラメータをカッコ内に含めてクラス名の後ろに付いて、__を渡すだけです.init__方法.これはこの方法の重要な点である.今、私たちは私たちの方法でselfを使用することができます.nameドメイン.これはsayHi法で検証された.
__new__():
__new__()は_にありますinit__()インスタンスオブジェクトを生成するために呼び出す.この方法とクラス属性の特性を利用して、設計モードにおける一例のモードを実現することができる.単一モードとは、一意のオブジェクトを作成することですか?単一モード設計のクラスは、1つのオブジェクトしかインスタンス化できません.
 

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Singleton(object):
  __instance = None            #     
 
  def __init__(self):
    pass
 
  def __new__(cls, *args, **kwd):     #  __init__    
    if Singleton.__instance is None:  #       
      Singleton.__instance = object.__new__(cls, *args, **kwd)
    return Singleton.__instance

 
 __getattr__()、__setattr__()と_getattribute__():
オブジェクトのプロパティを読み込むとpythonは自動的に__を呼び出します.getattr__()方法例えばfruit.colorはfruit._に変換されますgetattr__(color).割り当て文を使用してプロパティを設定すると、pythonは自動的に__を呼び出します.setattr__()メソッド._getattribute__()の機能と_getattr__()同様に、属性の値を取得する.でも_getattribute__()より良い制御を提供することができ、コードがより丈夫である.pythonには存在しないことに注意してください.setattribute__()方法
コード例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Fruit(object):
  def __init__(self, color = "red", price = 0):
    self.__color = color
    self.__price = price
     
  def __getattribute__(self, name):        #        
    return object.__getattribute__(self, name)
 
  def __setattr__(self, name, value):
    self.__dict__[name] = value
 
if __name__ == "__main__":
  fruit = Fruit("blue", 10)
  print fruit.__dict__.get("_Fruit__color")    #   color  
  fruit.__dict__["_Fruit__price"] = 5
  print fruit.__dict__.get("_Fruit__price")    #   price  

 
__getitem__():
クラスが属性をシーケンスとして定義する場合は、__を使用します.getitem__()シーケンス属性の要素を出力.果物屋さんでフルーツを何時間も販売しているとしたら、getitem__()フルーツショップの無種フルーツの入手方法
コード例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-class FruitShop:
   def __getitem__(self, i):   #         
     return self.fruits[i]   
if __name__ == "__main__":
  shop = FruitShop()
  shop.fruits = ["apple", "banana"]
  print shop[1]
  for item in shop:        #         
    print item,

 
出力:

banana

apple banana


 
 __str__():
__str__()オブジェクトが表す意味を表す文字列を返す.実現しました_str__()メソッドの後、print文を直接使用してオブジェクトを出力したり、関数str()で__をトリガしたりすることができます.str__()の実行これにより、オブジェクトと文字列を関連付けることで、あるプログラムの実装が容易になり、この文字列でクラスを表すことができます.
コード例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Fruit:   
  '''Fruit '''        # Fruit         
  def __str__(self):     #           
    return self.__doc__
 
if __name__ == "__main__":
  fruit = Fruit()
  print str(fruit)      #       str()  __str__()  ,     :Fruit 
  print fruit         #      fruit,  __str__()    ,     :Fruit 

 
__call__():
クラスでの実装_call__()メソッドでは、オブジェクトの作成時に直接_を返すことができます.call__()の内容この方法を用いて静的方法をシミュレートできる
コード例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Fruit:
  class Growth:    #    
    def __call__(self):
      print "grow ..."
 
  grow = Growth()   #   Growth(),    Growth      ,     Fruit    grow(),grow()   __call__()    
if __name__ == '__main__':
  fruit = Fruit()
  fruit.grow()     #     :grow ...
  Fruit.grow()     #     :grow ...