Python関数の書き換えを理解する方法

爱喝马黛茶的安东尼
リリース: 2019-06-25 15:43:33
オリジナル
4082 人が閲覧しました

カスタム クラスで作成されたインスタンスが組み込みオブジェクトと同様に組み込み関数の操作を実行できるように、カスタム クラスに対応するメソッドを追加します。これが関数の書き換えです。

オブジェクトから文字列関数へ: repr(obj)、このオブジェクトを表すことができる式文字列を返します。通常は eval(repr(obj)) == obj (この文字列は通常、実行に使用される Python によって解釈および実行されます)プログラマ)、str(obj) は指定されたオブジェクトを通じて文字列を返します (この文字列は通常人間によって読み取られます)。

Python関数の書き換えを理解する方法

オブジェクトの文字列関数への書き換えメソッド:

repr(obj) 関数の書き換えメソッド:

def __repr__(self):
ログイン後にコピー

str(obj) 関数の書き換え方法:

def __str__(self):
ログイン後にコピー

手順:

1. str(obj) 関数は、最初に obj を検索します。__str__() メソッド、このメソッドを呼び出し、結果

2 を返します。obj.__str__() メソッドがない場合は、obj.__repr__() メソッドの結果を返し、

3 を返します。 obj.__repr__ メソッドが存在しない場合、オブジェクト クラスの __repr__ インスタンス メソッドを呼び出すと、<__main__.XXXX object at 0xAABBCCDD>

例:## の形式で文字列が表示されます。 #

# 此示例示意通过重写 repr 和 str方法改变转为字符串的规则
class MyNumber:
    def __init__(self, value):
        &#39;构造函数,初始化MyNumber对象&#39;
        self.data = value
 
    def __str__(self):
        &#39;&#39;&#39;转换为普通人识别的字符串&#39;&#39;&#39;
        # print("__str__方法被调用!")
        return "自定义数字类型对象: %d" % self.data
 
    def __repr__(self):
        &#39;&#39;&#39;转换为eval能够识别的字符串&#39;&#39;&#39;
        return &#39;MyNumber(%d)&#39; % self.data
 
 
n1 = MyNumber(100)
n2 = MyNumber(200)
print(&#39;repr(n1) ====>&#39;, repr(n1))
print(&#39;str(n2)  ====>&#39;, str(n2))
ログイン後にコピー

関連する推奨事項: 「

Python ビデオ チュートリアル

他の組み込み関数を書き換える方法:

__abs__ abs(obj ) 関数

__len__ len(obj) 関数 (整数を返さなければなりません)

__reversed__ reversed(obj) 関数 (反復可能なオブジェクトを返さなければなりません)

__round__round(obj) 関数

例:

# 此示例示意abs 函数的重写
class MyInteger:
 
    def __init__(self, v):
        self.data = v
 
    def __repr__(self):
        return &#39;MyInteger(%d)&#39; % self.data
 
    def __abs__(self):
        v = abs(self.data)
        return MyInteger(v)  # 用v创建另一个MyInteger对象
 
    def __len__(self):
        return 10000
 
I1 = MyInteger(-10)
print(&#39;I1 =&#39;, I1)
 
I2 = abs(I1)
print("I2 =", I2)
 
print(&#39;len(I2)=&#39;, len(I2))  # 10000
ログイン後にコピー

数値変換関数の書き換え:

__complex__ complex(obj) 関数

__int__ int(obj) 関数

__float__ float(obj) 関数

__bool__ bool(obj) 関数 (以下のブール テスト関数のオーバーロードを参照)

例:

# 此示例示意数据转换构造函数的重写方法
class MyNumber:
 
    def __init__(self, value):
        self.data = value
 
    def __repr__(self):
        return &#39;MyNumber(%d)&#39; % self.data
 
    def __int__(self):
        &#39;int函数的重载&#39;
        return self.data
 
n1 = MyNumber(100)
x = int(n1)
print(n1)
 
print(bool(n1))  # True
n2 = MyNumber(0)
print(bool(n2))  # True
ログイン後にコピー

ブール型テスト関数の書き換え:

形式:

__bool__

#Function:

bool(obj) 関数の値に使用されます

if 文の真理値式で使用されます

while 文の真理値に使用されます

式内の記述:

1. カスタムクラスに __bool__(self) メソッドがある場合、このメソッドの戻り値は bool(obj) として使用されます。 ) 戻り値

2. __bool__(self) メソッドがない場合、bool(x) は __len__(self) メソッドの戻り値が 0 であるかどうかを返し、ブール値をテストします。

3. __len__(self) メソッドがない場合は、直接 True を返します。

例:

# 此示例示意bool(x) 函数的重写
class MyList:
    &#39;自定义类型的列表,用来保存数据,内部用一个列表来存储数据&#39;
 
    def __init__(self, iterable=()):
        self.data = [x for x in iterable]
 
    def __repr__(self):
        return &#39;MyList(%s)&#39; % self.data
 
    def __len__(self):
        &#39;&#39;&#39;返回长度&#39;&#39;&#39;
        print("__len__方法被调用")
        return len(self.data)
 
    def __bool__(self):
        print("__bool__方法调用")
        for x in self.data:
            if not x:
                return False
        return True
        # return False  # <<=== 所有对象都为False
 
myl = MyList([0, -1, 2, -3])
# myl = MyList()
print(myl)
print(bool(myl))
if myl:
    print("myl为真值")
else:
    print(&#39;myl为假值&#39;)
ログイン後にコピー

以上がPython関数の書き換えを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!