python中的subtype是什么?
大家讲道理
大家讲道理 2017-04-17 17:50:46
0
1
685

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'>
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(1)
Peter_Zhu

Répondez à la question

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__

À propos des fonctions

Pour aller plus loin, quels sont les paramètres
de

?__new__

class P:
    def __new__(cls):
        return cls
P()  #=> <class '__main__.P'>, 即类本身
P.__new__(P)  #=> 同上
clsCela 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

Instructions supplémentaires

1. Pour plus de description des
fonctions uniquement, il est recommandé de lire mon article pour comprendre les classes en Ruby.

python2, le code ci-dessus a été vérifié dans la version

,

il y a de légères différencespython3

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal