6.4、カスタムクラス

__str__

 

 

ダイレクトコール表示は、変数ではない__str__()が、__repr__()2つの違いはある__str__()ユーザーが見る返される文字列、および__repr__()、つまり、確認するために、文字列のプログラム開発者を返す__repr__()サービスをデバッグするため。

溶液は、第二を定義することです__repr__()しかし、通常__str__()、および__repr__()コードは同じです

 __repr__=__str__

 

 __iter__

あなたがのためのクラスになりたい場合はfor ... in、そのリストやタプルに似たサイクル、それが実装しなければならない__iter__()メソッドイテレータオブジェクトを返しますが、その後、ループ反復のためのPythonは、オブジェクトの呼び出しを継続する__next__()値の次のサイクルを取得する方法をそれが遭遇するまで、StopIterationエラーは、ループを終了します。

__getitem__

実装するには、次の標準的な、必要に応じて同様の要素上記のリストの振る舞いを削除する__getitem__()方法を:

 

 スライスしません

 

 

 私は、処理ステップ、および無負処理をしませんでした

__getattr__

 

 

 デフ__getattr __(自己、ATTR)

専用のプロパティが存在しない場合にのみ、呼び出したことを注意__getattr__など、既存の属性、nameではないで__getattr__検索を。

任意のこのような呼び出しがs.abc返されますNone、我々は定義されたので、それがある、__getattr__デフォルトが返されますNone我々は投げる、規則に従わなければならない、唯一のいくつかの特定の属性にクラスの応答をしてみましょうAttributeErrorエラー:

 

クラス学生(オブジェクト):
     デフ __init__ (自己):
        self.name = ' liuqi ' 
    DEF  __getattr__ (自己、ATTR):
         もし ATTR == ' 年齢' リターン・ ラムダ:25
        昇給はAttributeError(' \'学生\」オブジェクトが持っています無属性\ '%sの\' "%ATTR) 

 

 

 

__コール__

 

オブジェクトのインスタンスは、我々は、インスタンスメソッドを呼び出すと、我々が使用し、独自の属性とメソッドを持つことができますinstance.method()呼び出すこと。あなたは、インスタンス自体でそれを直接呼び出すことはできませんか?Pythonでは、答えはイエスです。

 

任意のクラスは、のみ定義する必要がある__call__()方法を、あなたは、例えば、直接呼び出すことができます

 

 変数がオブジェクトまたは関数であるかどうかを判断する方法は?実際には、より頻繁に、私たちが必要とするオブジェクトを呼び出すことができるかどうかを判断するために、オブジェクトを呼び出すことができるであるCallableターゲットな上記定義関数および当社と同様に、__call__()クラスのインスタンス:

 

 

 

 

 

クラスチェーン(オブジェクト):
     デフ __init__(自己、パス= '' ):
       自己。__Path = パス

   DEF  __getattr__ (自己、パス):
        戻り鎖(' %S /%S '%(自己。__Path 、パス))

   デフ __call__ (自己、パス):
        戻り鎖(' %S /%S '%( 。自己__Path 、パス))

   デフ __str__ (自己):
        戻り値の自己。__Path 

   __repr__ = __str__ 

   印刷(チェーン()。ユーザー(' マイケル').repos) /ユーザー/マイケル/レポ

 

Step 1:
Chain()  # 实例化
Step 2:
Chain().users
# 由于没有给实例传入初始化对应属性的具体信息,从而自动调用__getattr__()函数,从而有:
Chain().users = Chain('\users') # 这是重建实例
Step 3:
Chain().users('michael')
Chain().users('michael') = Chain('\users')('michael') # 这是对实例直接调用,相当于调用普通函数一样
# 关键就在这步,上面的朋友没有说明晰(并不是说你们不懂),这一步返回的是Chain('\users\michael'),再一次重建实例,覆盖掉Chain('\users'),
#记 renew = Chain('\users\michael'), 此时新实例的属性renew.__path = \users\michael;
Step 4:
Chain().users('michael').repos
# 这一步是查询renew实例的属性repos,由于没有这一属性,就会执行__getattr__()函数,再一次返回新的实例Chain('\users\michael\repos')并且覆盖点之前的实例,
# 这里记 trinew =Chain('\users\michael\repos'),不要忘了,一单定义了一个新的实例,就会执行__init__方法;
Step 5:
print(Chain().users('michael').repos) = print(trinew)  #由于我们定义了__str__()方法,那么打印的时候就会调用此方法,据此方法的定义,打印回来的是trinew的__path属#性,即——\users\michael\repos  。至此,我们也把所有定义的有特殊用的方法都用上了,完毕。

 

おすすめ

転載: www.cnblogs.com/soberkkk/p/12637224.html