Maison > Questions et réponses > le corps du texte
T.__new__(S, ...) -> a new object with type S, a subtype of T
这里的subtype指的是什么?
class A(int):
pass
class B(int):
def __new__(cls):
return A.__new__(int)
b = B()
isinstance(b, A)
#False
type(b)
#<class 'int'>
天蓬老师2017-04-17 17:52:46
Répondez à la question
subtype
est littéralement 子类
Utilisez issubclass(cls1, cls2)
pour déterminer si cls1
est une sous-classe de cls2
.
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__')
, mais quel est l'attributEn fait, l'accent ici n'est pas
.subtype
__new__
En termes simples,
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
?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.
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__
dePour aller plus loin, quels sont les paramètres
?__new__
class P:
def __new__(cls):
return cls
P() #=> <class '__main__.P'>, 即类本身
P.__new__(P) #=> 同上
cls
Cela implique une autre caractéristique essentielle de , c'est-à-dire que n'a pas de méthodes, seulement des fonctions. Lors de l'exécution de python
, il exécute en fait python
d'abord, puis P()
.p1 = P.__new__(P)
class X:
def hello(self):
return self.name
X.hello(m) #=> "enalix"
P.__init__(p1)
Pour résumer, n'a rien à voir avec , tout comme T.__new__(S, ...)
renvoie simplement l'attribut T
de hello
, qui est similaire à self
et n'a rien à voir avec lui . name
X
fonctions uniquement, il est recommandé de lire mon article pour comprendre les classes en Ruby.1. Pour plus de description des
python
2, le code ci-dessus a été vérifié dans la version
il y a de légères différencespython3