0
votes

comment créer une méthode pour une chaîne en python

Je cherche à créer quelque chose que je puisse utiliser pour vérifier si une chaîne remplit une condition comme celle-ci:

var = "hello"
check = var.checkconditions()

Je suis juste curieux de savoir si c'est possible comme je ne l'ai jamais vu auparavant .

Comment la fonction / tout ce que je dois utiliser serait-il défini?


4 commentaires

Je ne pense pas que Python connaisse les méthodes d'extension, du moins pas pour les types intégrés. Au lieu de cela, faites-en une fonction def checkconditions (s): ... et appelez-la comme check = checkconditions (var)


Il est possible, mais difficile et dépendra de tirer parti des détails d'implémentation, d'ajouter dynamiquement des méthodes aux types intégrés, et généralement cela n'en vaut pas la peine. Vous pouvez hériter de str , bien que souvent vous fassiez mieux d'utiliser collections.UserString avec lequel il est plus facile de travailler.


Notez que here est un projet qui fait cela. Mais encore une fois, cela va être fragile car cela dépend des détails de l'implémentation, et donc si les responsables de Python décident de changer un aspect de la façon dont str est implémenté, cela pourrait très bien casser cette approche.


Il s'agit d'un ancien article de Guido van Rossum, le créateur de Python, qui explique plus ou moins pourquoi le langage vous empêche de faire cela: mail.python.org/pipermail/python-dev/2003-April/034605.html


3 Réponses :


3
votes

La chaîne est une construction dans la classe / objet et ne peut pas être modifiée. Cependant, vous pouvez créer une nouvelle classe personnelle:

def checkconditions(str):
    # Enter conditions

var = 'Hello'
check = checkconditions(var)

Ou vous pouvez simplement créer une fonction qui prend la chaîne en entrée et en sortie si la condition est remplie ou non:

class str_class:
    def __init__ (self, str):
        self.str = str

    def checkconditions(self):
        # Enter your conditions

var = str_class('hello')
check = var.checkconditions()

Modifier: D'après d'autres commentaires, il semble que ce soit possible mais pas recommandé.


3 commentaires

Eh bien, cela peut . Mais ça ne devrait probablement pas. Mais c'est possible


Oui, je viens de lire votre commentaire sur le message original, intéressant, j'étais sûr que ce n'était pas possible d'avoir un problème similaire il y a quelques semaines. Merci pour votre contribution @ juanpa.arrivillaga


Eh bien, presque tout est possible si vous êtes prêt à vous fier aux détails de l'implémentation de CPython et à pénétrer dans les tripes du modèle d'objet CPython. Mais les créateurs de langage vous empêchent spécifiquement de le faire de manière simple, vous sortiriez donc des sentiers battus, pour ainsi dire.



0
votes

Vous pouvez utiliser une classe, puis utiliser la méthode check_conditions

    class Check:
       def __init__(self):
            pass

        def check_conditions(string):
            #Do whatever you need in here
            print(string)

    c = Check
    c.check_conditions("hello")

Cela devrait, espérons-le, faire ce dont vous avez besoin!


0 commentaires

1
votes

Vous ne pouvez pas directement ajouter la méthode au type d'origine. ce que vous pouvez faire est de sous-classer le type comme

var = 'hello'
var.checkconditions()

# Output 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'checkconditions'

"""

et ensuite vous pouvez instancier votre nouvelle classe

import __builtin__
__builtin__.str = mystring

var = str("hello")
check = var.checkconditions()

mais ce n'est toujours pas trop pratique, si vous voulez le rendre plus approprié, vous pouvez le faire

var = mystring('hello')
var.checkcondition()

qui obtient la plupart de l'effet souhaité .

Malheureusement, les objets créés par la syntaxe littérale continueront d'être du type vanilla et n'auront pas vos nouvelles méthodes / attributs.

class mystring(str):
    def checkconditions(self):
        #condition


1 commentaires

Notez que le module __builtin__ a été renommé en builtins en Python3