cari

Rumah  >  Soal Jawab  >  teks badan

python中的subtype是什么?

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'>
大家讲道理大家讲道理2890 hari yang lalu689

membalas semua(1)saya akan balas

  • 天蓬老师

    天蓬老师2017-04-17 17:52:46

    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

    balas
    0
  • Batalbalas