[PYTHON] Relation entre les opérateurs et les méthodes spéciales, essayez d'appeler une méthode numérique

Les opérations numériques ont été apprises à l'école, donc cela ne semble pas étrange, mais vous pouvez également utiliser les opérateurs «+», «» et «%» pour les chaînes de caractères. Je comprends toujours «+» et «», mais j'ai été surpris que «%» puisse être utilisé comme convertisseur de format.

>>> 'ABC' + '123'
'ABC123'
>>> 'ABC' * 3
'ABCABCABC'
>>> '%#08x' % 123
'0x00007b'
>>> '%d, %x, %o' % (123, 123, 123)
'123, 7b, 173'

python est un langage de script orienté objet, et les chaînes auront des méthodes de traitement, alors jetons un œil à la liste des méthodes de chaînes.

>>> dir('')    # ''La partie de peut être n'importe quelle chaîne de caractères
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

La seconde moitié de capitalize est une méthode normale pour les chaînes.

>>> help(''.capitalize)
Help on built-in function capitalize:

capitalize(...)
    S.capitalize() -> string
    
    Return a copy of the string S with only its first character
    capitalized.

>>> 'ABC'.capitalize()
'Abc'

>>> help(''.center)
Help on built-in function center:

center(...)
    S.center(width[, fillchar]) -> string
    
    Return S centered in a string of length width. Padding is
    done using the specified fill character (default is a space)

>>> 'Python'.center(30, '-')
'------------Python------------'

La première moitié du __ (deux soulignés) affiché pardir ('')est la méthode spéciale, qui semble être utilisée de manière fixe. __add__, __mul__, __mod__ sont les méthodes appelées par les opérateurs +, *, `% ʻ.

>>> 'ABC'.__add__('123')
'ABC123'
>>> 'ABC'.__mul__(3)
'ABCABCABC'
>>> '%#x'.__mod__(123)
'0x7b'

Grâce à la classe string définissant ces méthodes, vous pouvez manipuler des chaînes à l'aide d'opérateurs.

Alors qu'en est-il de ça?

>>> 'ABC' + '123' * 3
'ABC123123123'
>>> 'ABC'.__add__('123').__mul__(3)
'ABC123ABC123ABC123'

Le résultat est différent entre la formule ci-dessus et la formule du bas. Les opérateurs ont une priorité, et * a priorité sur+, donc l'interpréteur Python interprète l'expression ci-dessus comme`'ABC '+ (' 123 '* 3) ʻet: Le résultat est différent car la méthode est appelée.

>>> 'ABC'.__add__('123'.__mul__(3))
'ABC123123123'

Au fait, appelons également la méthode pour les valeurs numériques.

>>> dir(0)  #0 peut être un autre nombre
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> 123.__add__(456)
SyntaxError: invalid syntax
>>> 123 .__add__(456)
579
>>> (123).__add__(456)
579

En effet, «123 .__ add__ (456)» est une erreur de syntaxe, mais «.» Est interprété comme un point décimal. Vous pouvez appeler la méthode en laissant un espace ou en le plaçant entre parenthèses.

À propos, la fonction intégrée len appelle la méthode __len__. Personnellement, j'aimerais également définir un autre nom pour la méthode length ().

>>> len('abcdefg')
7
>>> 'abcdefg'.__len__()
7

Il existe d'autres méthodes spéciales utilisées pour les opérateurs de comparaison, l'accès au tableau, l'accès séquentiel, la réduction (), etc.

Recommended Posts

Relation entre les opérateurs et les méthodes spéciales, essayez d'appeler une méthode numérique
La relation subtile entre Gentoo et pip
À propos de la relation entre Git et GitHub
Héritage entre les types numériques Python et NumPy
Relation entre netfilter, firewalld, iptables et nftables
Relation entre la conversion des types de données Firestore et Go