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?
3 Réponses :
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é.
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.
Vous pouvez utiliser une classe, puis utiliser la méthode check_conditions Cela devrait, espérons-le, faire ce dont vous avez besoin! class Check:
def __init__(self):
pass
def check_conditions(string):
#Do whatever you need in here
print(string)
c = Check
c.check_conditions("hello")
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
Notez que le module __builtin__
a été renommé en builtins
en Python3
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 commecheck = 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'utilisercollections.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