subtype est littéralement 子类 Utilisez issubclass(cls1, cls2) pour déterminer si cls1 est une sous-classe de cls2.
Bien que je ne sache pas quelle version de
vous utilisez et quel document votre python intercepte, selon l'explication officielle, T.__new__(S, ...) crée simplement un objet instance de X.__init__(Y, ...) et n'a rien à faire avec Y . Le principe est que X a l'attribut X, qui peut être jugé par __new__.
hasattr(X, '__new__')
Exploration approfondie
En fait, l'accent ici n'est pas
, mais quel est l'attribut
.subtype__new__En termes simples,
contrôle la création d'objets, tandis que
contrôle l'initialisation des objets (comme l'ajout de variables d'attribut supplémentaires) et __new__ contrôle la destruction d'objets, dans des circonstances normales, vous n'en avez besoin que. se soucier de __init__ .__del____init__Réfléchissez à une question : le processus d'instanciation d'objet standard, tel que
, crée-t-il nécessairement un objet de
?n = N()NLa réponse est bien sûr non, le code est le suivant pour expliquer en détail la différence entre créer un objet et initialiser un objet.
class N:
def __init__(self, name):
self.name = name
class M:
def __new__(cls, name):
return N(name)
m = M("enalix")
isinstance(m, N) #=> true
isinstance(m, M) #=> false
m.name #=> "enalix"
Lorsque
renvoie un objet, l'objet et les paramètres excédentaires seront transmis au
de l'objet pour initialisation après la création.__new____init__
Bien que je ne sache pas quelle version desubtype
est littéralement子类
Utilisezissubclass(cls1, cls2)
pour déterminer sicls1
est une sous-classe decls2
.vous utilisez et quel document votre
Exploration approfondie , mais quel est l'attributpython
intercepte, selon l'explication officielle,T.__new__(S, ...)
crée simplement un objet instance deX.__init__(Y, ...)
et n'a rien à faire avecY
. Le principe est queX
a l'attributX
, qui peut être jugé par__new__
.hasattr(X, '__new__')
.
contrôle la création d'objets, tandis quesubtype
__new__
En termes simples,contrôle l'initialisation des objets (comme l'ajout de variables d'attribut supplémentaires) et
, crée-t-il nécessairement un objet de__new__
contrôle la destruction d'objets, dans des circonstances normales, vous n'en avez besoin que. se soucier de__init__
.__del__
__init__
Réfléchissez à une question : le processus d'instanciation d'objet standard, tel que?
n = N()
N
La réponse est bien sûr non, le code est le suivant pour expliquer en détail la différence entre créer un objet et initialiser un objet.Lorsque
renvoie un objet, l'objet et les paramètres excédentaires seront transmis aude l'objet pour initialisation après la création.
À propos des fonctions de__new__
__init__
?
__new__
cls
Cela implique une autre caractéristique essentielle de , c'est-à-dire quen'a pas de méthodes, seulement des fonctions. Lors de l'exécution de
python
, il exécute en faitpython
d'abord, puisP()
.p1 = P.__new__(P)
P.__init__(p1)
Pour résumer, n'a rien à voir avec, tout comme
Instructions supplémentaires fonctions uniquement, il est recommandé de lire mon article pour comprendre les classes en Ruby.T.__new__(S, ...)
renvoie simplement l'attributT
dehello
, qui est similaire àself
et n'a rien à voir avec lui .name
X
python
2, le code ci-dessus a été vérifié dans la versionil y a de légères différences
python3