ホームページ  >  記事  >  バックエンド開発  >  Python学習メモ - カスタムクラスを組み込み型に近づける魔法の方法

Python学習メモ - カスタムクラスを組み込み型に近づける魔法の方法

高洛峰
高洛峰オリジナル
2017-02-18 10:46:021149ブラウズ

Python のマジック メソッドは、__XXX__ のような Python で事前定義された関数です。 __XXX__类型的函数。
使用Python的魔术方法的最大优势在于python提供了简单的方法让对象可以表现得像内置类型一样。

__str__函数

__str__函数用于处理打印实例本身的时候的输出内容。如果没有覆写该函数,则默认输出一个对象名称和内存地址。
例如:

>>> class Student(object):
...     def __init__(self,name):
...             self._name = name
...
>>> print Student()

输出:<__main__.Student object at 0x0000000002A929E8>.
那么我们如何让输出的结果可读性更高一点呢?我们可以覆写__str__函数。例如

>>> class Student(object):
...     def __init__(self, name):
...             self._name = name
...     def __str__(self):
...             return  "I'm a student, named %s" % self._name
...
>>> print Student("Charlie")

输出结果就是:I'm a student, named Charlie.
我们将str()函数作用于该对象的时候,其实是调用了该对象的__str__函数。

_repr_ 函数

__repr__也是将对象序列化,但是__repr__更多的是给python编译器看的。__str__更多的是可读性(readable)。
我们将repr()函数作用于摸某一个对象的时候,调用的其实就是该函数的__repr__函数。

repr()成对的是eval()函数。eval()函数是将序列化后的对象重新转为对象。前提是该对象实现了__repr__函数。

上面这一段话基于自己的理解,不知道对错。

>>> item = [1,2,3]
>>> repr(item)
'[1, 2, 3]'
>>> other_item = eval(repr(item))
>>> other_item[1]
2

__iter__函数

我们经常对list或者tuple使用for...in...来迭代。那是list继承自Iterable。Iterable实现了__iter__函数。

要想将一个自定义的对象变成一个可迭代的对象,那么必须要实现两个方法:__iter__next.

__iter__函数返回一个对象。迭代的时候则会不断地调用next函数拿到下一个值,直到捕获到StopIteration停止。
廖雪峰老师教程里写的是__next__方法,不知道为啥。

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def next(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > 10000:
            raise StopIteration
        return self.a


for i in Fib():
    print i

__getitem__函数

上面通过实现__iter__函数实现对象的迭代。
那么如何实现对象按下标取出元素呢。
这是通过实现对象的__getitem__ Python のマジック メソッドを使用する最大の利点は、Python がオブジェクトを組み込み型のように動作させる簡単なメソッドを提供することです。

__str__ 関数


__str__ 関数は、インスタンス自体を印刷するときに出力コンテンツを処理するために使用されます。この関数がオーバーライドされていない場合、オブジェクト名とメモリ アドレスがデフォルトで出力されます。 🎜例: rrreee🎜 出力: <__main__.Student object at 0x0000000002A929E8>.🎜 では、出力結果を読みやすくするにはどうすればよいでしょうか? __str__ 関数をオーバーライドできます。例:rrreee🎜出力結果は次のようになります: 私は Charlie という名前の学生ですstr() 関数をオブジェクトに適用すると、実際には、オブジェクトの __str__ 関数が呼び出されます。

_repr_ 関数

🎜__repr__ もオブジェクトをシリアル化しますが、__repr__ の方が Python コンパイラーが認識するものです。それ。 __str__ は読みやすさに重点を置いています。 🎜 repr() 関数を適用してオブジェクトにアクセスするとき、実際に呼び出すのはその関数の __repr__ 関数です。 🎜 repr() と対になるのは eval() 関数です。 eval() 関数は、シリアル化されたオブジェクトをオブジェクトに変換して戻します。前提条件は、オブジェクトが __repr__ 関数を実装していることです。 🎜上記の文章は私自身の理解に基づいており、正しいか間違っているかはわかりません。 rrreee

__iter__ 関数

🎜リストやタプルを反復処理するために for...in... をよく使用します。つまり、リストは Iterable から継承されます。 Iterable は __iter__ 関数を実装します。 🎜カスタム オブジェクトを反復可能なオブジェクトに変換したい場合は、__iter__next という 2 つのメソッドを実装する必要があります。🎜 __iter__関数はオブジェクトを返します。反復する場合、StopIteration がキャプチャされて停止されるまで、next 関数が継続的に呼び出され、次の値を取得します。 🎜Liao Xuefeng 先生がチュートリアルで __next__ メソッドを書きましたが、理由はわかりません。 rrreee

__getitem__ 関数

🎜上記は、__iter__ 関数を実装することでオブジェクトの反復を実装します。 🎜それでは、添え字によって要素を抽出するオブジェクトを実装する方法を説明します。 🎜これは、オブジェクトの __getitem__ メソッドを実装することによって行われます。 🎜一つあげましょう
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。