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

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

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

membalas semua(1)
Peter_Zhu

Jawab soalan

subtype secara literalnya 子类 Gunakan issubclass(cls1, cls2) untuk menentukan sama ada cls1 ialah subkelas cls2

Walaupun saya tidak pasti versi

yang anda gunakan dan dokumen mana yang python anda memintas, menurut penjelasan rasmi, T.__new__(S, ...) hanya mencipta objek contoh X.__init__(Y, ...) dan tiada kaitan dengan Y . Premisnya ialah X mempunyai atribut X, yang boleh dinilai oleh __new__ hasattr(X, '__new__')

Penerokaan mendalam

Sebenarnya, tumpuan di sini bukanlah
, tetapi apakah atribut

itu.subtype __new__Ringkasnya,

mengawal penciptaan objek, manakala

mengawal pemulaan objek (seperti menambah pembolehubah atribut tambahan), dan __new__ mengawal pemusnahan objek Dalam keadaan biasa, anda hanya perlu untuk mengambil berat tentang __init__ .__del__ __init__Fikirkan tentang soalan, adakah proses instantiasi objek standard, seperti

, semestinya mencipta objek

?n = N() NJawapannya sudah tentu tidak, kodnya adalah seperti berikut untuk menerangkan secara terperinci perbezaan antara mencipta objek dan memulakan objek.

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"

Apabila

mengembalikan objek, objek dan parameter berlebihan akan dihantar ke

objek untuk permulaan selepas penciptaan.__new__ __init__

Mengenai fungsi

Melangkah lebih jauh, apakah parameter

?__new__

class P:
    def __new__(cls):
        return cls
P()  #=> <class '__main__.P'>, 即类本身
P.__new__(P)  #=> 同上
clsIni melibatkan satu lagi ciri penting , iaitu,

tidak mempunyai kaedah, hanya berfungsi Apabila melaksanakan python, ia sebenarnya melaksanakan python dahulu, dan kemudian P().p1 = P.__new__(P)

class X:
    def hello(self):
        return self.name
X.hello(m)  #=> "enalix"
P.__init__(p1)Ringkasnya, tiada kaitan dengan

, sama seperti T.__new__(S, ...) hanya mengembalikan atribut T hello, yang serupa dengan self dan tiada kaitan dengannya name X

Arahan tambahan

1. Untuk penerangan lanjut tentang
fungsi sahaja, adalah disyorkan untuk membaca artikel saya untuk memahami kelas dalam Ruby.

python2, kod di atas telah disahkan dalam versi

,

terdapat sedikit perbezaanpython3

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan