Comment comprendre la réécriture des fonctions Python

爱喝马黛茶的安东尼
Libérer: 2019-06-25 15:43:33
original
4092 Les gens l'ont consulté

Ajoutez les méthodes correspondantes dans la classe personnalisée afin que les instances créées par la classe personnalisée puissent effectuer des opérations de fonction intégrées comme des objets intégrés. Il s'agit d'une réécriture de fonction.

Fonction objet en chaîne : repr(obj), renvoie une chaîne d'expression qui peut représenter cet objet, généralement eval(repr(obj)) == obj (cette chaîne est généralement interprétée et exécutée par python utilisé pour exécuter le programmeur), str(obj) renvoie une chaîne via l'objet donné (cette chaîne est généralement lue par les humains).

Comment comprendre la réécriture des fonctions Python

Méthode de réécriture de l'objet en fonction de chaîne :

Méthode repr(obj) de la fonction de réécriture :

Méthode de réécriture de
def __repr__(self):
Copier après la connexion

fonction str(obj) :

def __str__(self):
Copier après la connexion

Explication :

1. La fonction str(obj) recherche d'abord, obj. méthode, appelez cette méthode et renvoyez le résultat

2 S'il n'y a pas de méthode obj.__str__(), renvoyez le résultat de la méthode obj.__repr__() et renvoyez

3. La méthode obj.__repr__ n'existe pas, alors l'appel de la méthode d'instance __repr__ de la classe d'objet affiche une chaîne au format <__main__.XXXX objet à 0xAABBCCDD>

Exemple :

# 此示例示意通过重写 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))
Copier après la connexion

Recommandations associées : "Tutoriel vidéo Python"

Comment réécrire d'autres fonctions intégrées :

__abs__ abs( obj) fonction

__len__ len(obj) fonction (doit renvoyer un entier)

__reversed__ reverse(obj) fonction (doit renvoyer un objet itérable

__round__ round(obj) fonction

Exemple :

# 此示例示意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
Copier après la connexion

Réécriture de la fonction de conversion numérique :

__complex__ fonction complexe(obj)

Fonction __int__ int(obj)

Fonction __float__ float(obj)

Fonction __bool__ bool(obj) (voir surcharge de la fonction de test booléen ci-dessous)

Exemple :

# 此示例示意数据转换构造函数的重写方法
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
Copier après la connexion

Réécriture de la fonction de test booléen :

Format :

__bool__

Fonction :

Utilisé pour bool(obj) Valeur de fonction

Utilisé dans l'expression de la valeur de vérité de l'instruction if

Utilisé pour la valeur de vérité de l'instruction while

description dans l'expression :

1. Lorsqu'il existe une méthode __bool__(self) dans la classe personnalisée, la valeur de retour de cette méthode est utilisée comme bool( obj ) valeur de retour

2. Lorsqu'il n'y a pas de méthode __bool__(self), bool(x) renvoie si la valeur de retour de la méthode __len__(self) est nulle pour tester la valeur booléenne

3. Lorsqu'il n'y a pas de méthode __len__(self), True

est renvoyé directement Exemple :

# 此示例示意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;)
Copier après la connexion
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal