Apakah kaedah asas menggunakan kelas Python?

WBOY
Lepaskan: 2023-05-17 23:58:04
ke hadapan
5320 orang telah melayarinya

1. Berorientasikan objek

Kelas (kelas): Ia ialah koleksi objek yang digunakan untuk menerangkan atribut dan kaedah yang sama.

Pembolehubah kelas: Pembolehubah kelas adalah awam di seluruh objek yang diinstantiate. Ditakrifkan secara amnya di dalam kelas dan di luar badan fungsi.

Kaedah: Fungsi dalam kelas

Ahli data: Pembolehubah kelas atau pembolehubah instance digunakan untuk memproses data yang berkaitan dengan kelas dan objek instancenya.

Penulisan semula kaedah: Jika kaedah yang diwarisi daripada kelas induk tidak dapat memenuhi keperluan subkelas, ia boleh ditulis semula Proses ini dipanggil penggantian kaedah, juga dikenali sebagai penulisan semula kaedah.

Pembolehubah setempat: Pembolehubah yang ditakrifkan dalam kaedah hanya bertindak pada kelas tika semasa.

Pembolehubah instance: Dalam pengisytiharan kelas, atribut diwakili oleh pembolehubah sedemikian dipanggil pembolehubah instance ialah pembolehubah yang diubah suai dengan diri.

Warisan: Kelas terbitan mewarisi medan dan kaedah kelas asas. Warisan juga membenarkan objek kelas terbitan untuk dianggap sebagai objek kelas asas. Sama seperti kita mentakrifkan kelas buah-buahan, dan kemudian mentakrifkan epal kelas terbitan, yang mempunyai beberapa sifat dan kaedah kelas buah-buahan, dan juga mempunyai beberapa sifat unik dan kaedahnya sendiri, yang serupa dengan kelas buah-buahan hubungan 'adalah-sebuah'.

Instantiation: Objek khusus kelas Imej kelas adalah bersamaan dengan templat Hanya selepas kami menjadikannya sebagai objek, kami boleh melakukan operasi yang sepadan padanya.

Objek: Contoh struktur data yang ditakrifkan oleh kelas. Objek termasuk dua ahli data (pembolehubah kelas dan pembolehubah contoh) dan kaedah.


2. Definisi kelas

Tentukan kelas:

class ClassName:....    ....    ....
Salin selepas log masuk

Adalah disyorkan bahawa nama kelas dinamakan dalam kes unta, atau semua huruf besar


3 Gunakan kaedah objek kelas

Objek kelas menyokong dua operasi: rujukan atribut dan instantiasi

Rujukan atribut: dan dalam python Sintaks yang lain adalah sama, obj.name

Atribut dengan __ dalam kelas ialah atribut peribadi kelas tidak boleh diakses terus di luar kelas, seperti __name.

class Fruit:#这是类的一个基本属性self.number = 100def get_number(self):                a = self.number + 100return a

f = Fruit()print('We have {0} fruits'.format(f.number))print('We have {0} fruits'.format(f.get_number()))
Salin selepas log masuk

Hasil keluaran ialah:

We have 100 fruitsWe have 200 fruits
Salin selepas log masuk

4 Kaedah pembinaan

Terdapat kaedah khas yang dipanggil __init__() dalam kelas python, dipanggil pembinaan. kaedah, yang dilaksanakan dalam kelas Ia akan dipanggil secara automatik semasa instantiasi (boleh digunakan untuk permulaan atribut kelas, dll.), serupa dengan pembina kelas dalam C++. Kelas

def __init__(self):self.data = []
Salin selepas log masuk

mentakrifkan kaedah __init__() dan operasi instantiasi kelas akan memanggil kaedah __init__() secara automatik.

class Fruit:def __init__(self):                print('你已经实例化了一个对象')
f = Fruit()
Salin selepas log masuk

Hasil keluaran

你已经实例化了一个对象
Salin selepas log masuk

Kaedah init_() boleh mempunyai parameter dan parameter dihantar ke operasi instantiasi kelas melalui init().

class Complex:def __init__(self,real,image):self.r = realself.i = imagedef get_complex(self):                print('complex real is %.2f , image is %.2f'%(self.r,self.i))
a = Complex(3.5,-3)a.get_complex()
Salin selepas log masuk

Hasil keluaran adalah seperti berikut:

complex real is 3.50 , image is -3.00
Salin selepas log masuk

diri mewakili contoh kelas, bukan kelas. Terdapat hanya satu perbezaan istimewa antara kaedah kelas dan fungsi biasa - mereka mesti mempunyai nama parameter pertama tambahan, yang mengikut konvensyen adalah diri. Tetapi diri bukan kata kunci dalam Python.

Saya tertanya-tanya sama ada ia boleh difahami dengan cara ini, diri mewakili alamat objek selepas anda membuat instantiat objek mengikut kelas. Sama seperti penunjuk ini dalam kelas C++

class Test:def prt(self):        print(self)        print(self.__class__)
t = Test()t.prt()
Salin selepas log masuk

Output:

<__main__.Test object at 0x0000025EC6D45608><class &#39;__main__.Test&#39;>
Salin selepas log masuk

5. Kaedah kelas

Di dalam kelas, gunakan Kata Kunci def untuk mentakrifkan kaedah Tidak seperti definisi fungsi umum, kaedah kelas mesti mengandungi parameter diri, yang merupakan parameter pertama. Jika anda tidak memerlukan diri untuk lulus parameter, anda perlu menambah @staticmethod di hadapan fungsi, menunjukkan bahawa kaedah statik

class Complex:def __init__(self, real=None, image=None):self.r = realself.i = image
def get_complex(self):        print('complex real is %.2f , image is %.2f' % (self.r, self.i))
    @staticmethoddef test(a, b):        print('complex real is %.2f , image is %.2f' % (a, b))

a = Complex(3.5, -3)a.get_complex()
b = Complex()b.test(3, -2)
Salin selepas log masuk

mengeluarkan hasil

complex real is 3.50 , image is -3.00complex real is 3.00 , image is -3.00
Salin selepas log masuk

6. Warisan

Python juga menyokong warisan kelas, formatnya adalah seperti berikut:

class Derivedclassname(Baseclassname):    ...    ...
Salin selepas log masuk

Nama kelas asas (nama kelas asas) mesti ditakrifkan dalam skop yang sama dengan kelas terbitan. Selain kelas, anda juga boleh menggunakan ungkapan, yang sangat berguna apabila kelas asas ditakrifkan dalam modul lain:

class Fruit:    def __init__(self,sweet):        self.sweetness = sweet    def describe(self):        print('Our fruit has a sweetness of %.2f'%self.sweetness)
class Apple(Fruit):#单继承,继承fruit类    def __init__(self,sweet,color):        self.color = color        Fruit.__init__(self,sweet)    def describe(self):#改写基类fruit的方法        print('Our apple has a sweetness of {0:.2f}%,and color is {1}'.format(self.sweetness,self.color))

apple = Apple(62.2,'red')apple.describe()
Salin selepas log masuk

Output:

Our apple has a sweetness of 62.20%,and color is red
Salin selepas log masuk

Warisan berbilang

Python boleh juga Mewarisi berbilang kelas asas:

class Derivedclassname(basename1,basename2,...):    ...    ...    ...
Salin selepas log masuk

Anda perlu memberi perhatian kepada susunan kelas induk dalam kurungan Jika terdapat nama kaedah yang sama dalam kelas induk, tetapi ia tidak dinyatakan semasa menggunakan subclass, Python mencari dari kiri ke kanan, iaitu Apabila kaedah tidak ditemui dalam subkelas, cari dari kiri ke kanan untuk melihat sama ada kaedah itu termasuk dalam kelas induk.

class Fruit:def __init__(self, sweet):        self.sweetness = sweetdef describe(self):        print('Our fruit has a sweetness of %.2f' % self.sweetness)

class Food:def __init__(self, uprice, num):        self.unit_price = uprice        self.number = num        self.total_price = num * upricedef cost(self):        print('You need to pay {0:.3} yuan, thank you'.format(self.total_price))

class Apple(Fruit, Food):def __init__(self, sweet, color, uprice, num):        self.color = color        Fruit.__init__(self, sweet)        Food.__init__(self, uprice, num)def describe(self):        print('Our fruit has a sweetness of {0:.2f}%,and color is {1}'.format(self.sweetness, self.color))
Salin selepas log masuk
rrree

Output:

Our fruit has a sweetness of 62.20%,and color is redYou need to pay 73.5 yuan, thank you
Salin selepas log masuk

7、方法重写

如果父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,如果想调用已经被覆盖的基类方法,可以用super(子类名,子类实例对象名).父类方法

class Parent_class:def Method(self):         print ('父类方法')

class Child_class(Parent_class): # 定义子类def Method(self):        print ('子类方法')

c = Child_class()                # 子类实例化c.Method()                  # 子类调用重写方法super(Child_class,c).Method()    #用子类对象调用父类已被覆盖的方法
Salin selepas log masuk

子类继承父类构造函数

如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。

class A:def __init__(self, x, y):        self.x = x        self.y = y        print('pos is ({0},{1})'.format(self.x, self.y))
def xxx(self):        print('parent now')

class B(A):def xxx(self):        print('child now')

b = B(10, 3)b.xxx()
Salin selepas log masuk

输出

pos is (10,3)child now
Salin selepas log masuk

如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__。

如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字super(子类,self).__init__(参数1,参数2,....),或者父类名称.__init__(self,参数1,参数2,...)


8、类的私有属性

两个下划线开头,声明该属性为私有,像__name不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__name。

class JustCounter:     __secretCount = 0  # 私有变量    publicCount = 0  # 公开变量
def count(self):        self.__secretCount += 1        self.publicCount += 1       print(self.__secretCount)

counter = JustCounter()counter.count()counter.count()print(counter.publicCount)print(counter.__secretCount)  # 报错,实例不能访问私有变量
Salin selepas log masuk
Traceback (most recent call last):File "test.py", line 16, in <module>    print (counter.__secretCount)  # 报错,实例不能访问私有变量AttributeError: 'JustCounter' object has no attribute '__secretCount'
Salin selepas log masuk

两个下划线开头,声明该方法为私有方法,像__private_method,只能在类的内部调用 ,不能在类的外部调用。self.___private_method。

class Site:def __init__(self, name, url):        self.name = name  # public        self.__url = url  # private
def who(self):        print('name  : ', self.name)        print('url : ', self.__url)
def __foo(self):  # 私有方法        print('这是私有方法')
def foo(self):  # 公共方法        print('这是公共方法')        self.__foo()

x = Site('***', 'www.xxx.com')x.who() # 正常输出x.foo() # 正常输出x.__foo()  # 报错
Salin selepas log masuk

输出:

'''name  :  ***url :  www.***.com这是公共方法这是私有方法Traceback (most recent call last):  File "F:\Python\Program\test.py", line 61, in <module>    x.__foo()      # 报错AttributeError: 'Site' object has no attribute '__foo''''
Salin selepas log masuk

类的专有方法

__init__ : 构造函数,在生成对象时调用,类似C++构造函数

__del__: 析构函数,释放对象时使用,类似C++析构函数,常用在释放申请的内存空间

__repr__: 打印,转换。这个个函数就是在打印类的时候,控制类输出的字符串

class Name:def __init__(self, name):        self.name = name

print(Name('s'))
Salin selepas log masuk
'''<__main__.Name object at 0x0000023744AFD248>'''
Salin selepas log masuk
class Name:def __init__(self,name):        self.name = name
def __repr__(self): #控制了在打印类时候的输出          return 'Name({!r})'.format(self.name)

print(Name('s'))
'''Name('s')'''
Salin selepas log masuk

__setitem__ : 每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环

__getitem__: 当访问不存在的属性时会调用该方法

__len__: 获得长度,如果一个类表现得像一个list,要获取有多少个元素,就得用len() 函数。要让len()函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。

class CountList:def __init__(self, *args):        self.list = [x for x in args]        self.count = self.__len__()
def __len__(self):         return len(self.list)
def get_count(self):         return self.count

a = CountList(1, 2, 3, 4, 4, 5)print(a.get_count())print(len(a))
Salin selepas log masuk

__cmp__: 比较运算

__call__: 函数调用

__add__: 加运算

__sub__: 减运算

class MyClass:
def __init__(self, height, weight):        self.height = height        self.weight = weight
# 两个对象的长相加,宽不变.返回一个新的类def __add__(self, others):        return MyClass(self.height + others.height, self.weight + others.weight)
# 两个对象的宽相减,长不变.返回一个新的类def __sub__(self, others):        return MyClass(self.height - others.height, self.weight - others.weight)
# 说一下自己的参数def intro(self):        print("高为", self.height, " 重为", self.weight)

def main():    a = MyClass(height=10, weight=5)    a.intro()
    b = MyClass(height=20, weight=10)    b.intro()
    c = b - a    c.intro()
    d = a + b    d.intro()

if __name__ == '__main__':    main()
Salin selepas log masuk
'''高为 10  重为 5高为 20  重为 10高为 10  重为 5高为 30  重为 15'''
Salin selepas log masuk

__mul__: 乘运算

__truediv__: 除运算

__mod__: 求余运算

__pow__: 乘方

同样的。类的专有方法也可以重写

Atas ialah kandungan terperinci Apakah kaedah asas menggunakan kelas Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!