python 类方法的使用场景
大家讲道理
大家讲道理 2017-04-18 09:41:46
0
2
950

python的类方法的定义和使用都了解, 问题是什么情况下会使用python类方法,而不是普通方法或静态方法?

大家讲道理
大家讲道理

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

membalas semua(2)
黄舟

Contoh yang boleh saya fikirkan ialah kaedah kelas sering digunakan sebagai pengganti untuk pembina (__init__).

Berikut ialah contoh mudah:

class Calculator:

    def __init__(self, *numbers):
        self.numbers = numbers

    def sum(self):
        return sum(self.numbers)

    def avg(self):
        return sum(self.numbers)/len(self.numbers)

if __name__ == '__main__':
    c = Calculator(1,2,3,4,5)
    print(c.sum())
    print(c.avg())    

Ini adalah kelas kalkulator yang tidak berguna, tetapi jangan risau tentangnya Apakah yang perlu saya lakukan jika saya ingin membina kelas ini diberi urutan (Senarai atau Tuple)?

Malah, hanya gunakan ungkapan bintang:

    numbers = [6,7,8,9,10]
    c2 = Calculator(*numbers)
    print(c2.sum())
    print(c2.avg())

Tetapi kaedah kelas ialah pilihan lain pada masa ini:

class Calculator:

    def __init__(self, *numbers):
        self.numbers = numbers

    def sum(self):
        return sum(self.numbers)

    def avg(self):
        return sum(self.numbers)/len(self.numbers)

    @classmethod
    def fromseq(cls, seq):
        return cls(*seq)

if __name__ == '__main__':
    numbers = [6,7,8,9,10]
    c3 = Calculator.fromseq(numbers)
    print(c3.sum())
    print(c3.avg())

Kami boleh menggunakan kaedah kelas dengan mudah untuk melaksanakan penggantian pembina Sebab utama ialah parameter kaedah kelas pertama menerima objek kelas, yang membolehkan kami memproses hujah yang dihantar oleh kaedah kelas kepada pembina standard, mencipta objek menggunakan kelas objek dan mengembalikannya.

Jika perkara ini diserahkan kepada kaedah contoh, akan ada kaedah penukaran tambahan menggunakan type(self) Menggunakan kaedah statik memerlukan pengekodan keras nama kelas dalam kaedah, yang tidak begitu sesuai:

class Calculator:
    ...(略)...
    
    @classmethod
    def fromseq(cls, seq):
        return cls(*seq)
    
    def fromseq2(self, seq):
        return type(self)(*seq) # 多一個步驟
        
    @staticmethod
    def fromseq3(seq):
        return Calculator(*seq) # 哪一天這個類改名字了這裡也要改...

Jika anda ingin mengetahui lebih lanjut tentang kaedah contoh, kaedah kelas dan kaedah statik, anda boleh merujuk kepada:

  • Dalam keadaan apakah kaedah statik Python harus digunakan?

  • Panduan muktamad tentang cara menggunakan kaedah statik, kelas atau abstrak dalam Python


Soalan yang saya jawab: Python-QA

阿神

Tunggu sebentar dan tulis contoh~


python3

class 类方法演示(object):

    类变量 = '哈哈'

    def __init__(实例):
        实例.实例变量 = '实例值'

    def 测试1(实例): #实例方法
        print('测试1')
        print(实例)

    @classmethod #类方法
    def 测试2(此类): # 此类 就是 类方法演示 自身
        print(此类)
        print('测试2')
        print(类方法演示.类变量)
        print('----------------')

    @staticmethod #静态方法
    def 测试3(): # 这里可以不传递参数。
        print(类方法演示.类变量)
        print('测试3')

if __name__ == '__main__':
    对象 = 类方法演示()
    对象.测试1()
    对象.测试2()
    对象.测试3()
    类方法演示.测试3()
Kedua-dua

类方法 dan 静态方法 boleh mengakses 类变量, tetapi bukan 实例变量.
静态变量, nampaknya 闭包 hanya boleh dicapai melalui 静态变量 dalam python.

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