面向?qū)ο缶幊淌且环N編程范式,它將程序中的數(shù)據(jù)和操作封裝在一個(gè)對(duì)象中
,通過(guò)調(diào)用對(duì)象的方法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作。在Python中,類(lèi)是一種用戶自定義的數(shù)據(jù)類(lèi)型,它可以用來(lái)創(chuàng)建對(duì)象。對(duì)象是類(lèi)的實(shí)例,它包含了數(shù)據(jù)和方法。2、類(lèi)的定義和實(shí)例化在Python中,可以使用class關(guān)鍵字來(lái)定義類(lèi)
,類(lèi)名習(xí)慣以大寫(xiě)字母開(kāi)頭。類(lèi)包含了屬性和方法,屬性是類(lèi)的數(shù)據(jù)成員,方法是類(lèi)的函數(shù)成員。在類(lèi)中,可以使用self關(guān)鍵字來(lái)引用當(dāng)前對(duì)象的屬性和方法。(相關(guān)資料圖)
class MyClass: def __init__(self, name): self.name = name def say_hello(self): print("Hello, " + self.name + "!")# 實(shí)例化對(duì)象obj = MyClass("world")# 調(diào)用對(duì)象的方法obj.say_hello() # 輸出:Hello, world!
3、對(duì)象的屬性和方法對(duì)象的屬性是指對(duì)象所包含的數(shù)據(jù)成員
,對(duì)象的方法是指對(duì)象所包含的函數(shù)成員。在Python中,對(duì)象的屬性和方法可以通過(guò)點(diǎn)號(hào)(.)來(lái)訪問(wèn)。class MyClass: def __init__(self, name): self.name = name def say_hello(self): print("Hello, " + self.name + "!")# 實(shí)例化對(duì)象obj = MyClass("world")# 訪問(wèn)對(duì)象的屬性和方法print(obj.name) # 輸出:worldobj.say_hello() # 輸出:Hello, world!
二、繼承和多態(tài)1、繼承的概念和實(shí)現(xiàn)繼承是指一個(gè)類(lèi)可以獲得另一個(gè)類(lèi)的屬性和方法
,從而避免重復(fù)編寫(xiě)代碼,提高代碼的復(fù)用性和擴(kuò)展性。在Python中,可以使用class關(guān)鍵字來(lái)定義繼承關(guān)系
,使用super()函數(shù)來(lái)調(diào)用父類(lèi)的方法
。
class Animal: def __init__(self, name): self.name = name def eat(self): print(self.name + " is eating.")class Cat(Animal): def __init__(self, name, color): super().__init__(name) self.color = color def meow(self): print(self.name + " is meowing.")# 實(shí)例化對(duì)象cat = Cat("Tom", "white")# 調(diào)用對(duì)象的屬性和方法print(cat.name) # 輸出:Tomprint(cat.color) # 輸出:whitecat.eat() # 輸出:Tom is eating.cat.meow() # 輸出:Tom is meowing.
2、多態(tài)的概念和實(shí)現(xiàn)多態(tài)是指同一種類(lèi)型的對(duì)象
,調(diào)用同一個(gè)方法可以產(chǎn)生不同的結(jié)果
。在Python中,多態(tài)可以通過(guò)方法的重寫(xiě)和方法的重載來(lái)實(shí)現(xiàn)
。
方法的重寫(xiě)是指子類(lèi)重新定義父類(lèi)中已有的方法,從而實(shí)現(xiàn)對(duì)方法的覆蓋
。
class Animal: def __init__(self, name): self.name = name def eat(self): print(self.name + " is eating.")class Cat(Animal): def __init__(self, name, color): super().__init__(name) self.color = color def eat(self): print(self.name + " is eating fish.")# 實(shí)例化對(duì)象cat = Cat("Tom", "white")# 調(diào)用對(duì)象的方法cat.eat() # 輸出:Tom is eating fish.
方法的重載是指在一個(gè)類(lèi)中定義多個(gè)同名的方法
,但是這些方法的參數(shù)類(lèi)型和個(gè)數(shù)不同,從而實(shí)現(xiàn)對(duì)方法的擴(kuò)展
。
class MyClass: def my_method(self): print("my_method() without parameter") def my_method(self, x): print("my_method() with parameter: " + str(x))# 實(shí)例化對(duì)象obj = MyClass()# 調(diào)用對(duì)象的方法obj.my_method() # 報(bào)錯(cuò):TypeError: my_method() missing 1 required positional argument: "x"obj.my_method(123) # 輸出:my_method() with parameter: 123
三、抽象類(lèi)和接口1、抽象類(lèi)的定義和實(shí)現(xiàn)抽象類(lèi)是指不能被實(shí)例化的類(lèi)
,它只能作為其他類(lèi)的父類(lèi)
,用于定義抽象方法和屬性。在Python中
,可以使用abc模塊來(lái)定義抽象類(lèi)
,使用@abstractmethod裝飾器來(lái)定義抽象方法和屬性。
from abc import ABC, abstractmethodclass Animal(ABC): @abstractmethod def eat(self): passclass Cat(Animal): def eat(self): print("Cat is eating fish.")# 實(shí)例化對(duì)象cat = Cat()# 調(diào)用對(duì)象的方法cat.eat() # 輸出:Cat is eating fish.
2、接口的定義和實(shí)現(xiàn)接口是指一組抽象方法和屬性的集合
,用于描述類(lèi)所提供的服務(wù)。在Python中,接口并沒(méi)有嚴(yán)格的定義,一般使用抽象類(lèi)來(lái)實(shí)現(xiàn)接口的功能。from abc import ABC, abstractmethodclass IAnimal(ABC): @abstractmethod def eat(self): passclass Cat(IAnimal): def eat(self): print("Cat is eating fish.")# 實(shí)例化對(duì)象cat = Cat()# 調(diào)用對(duì)象的方法cat.eat() # 輸出:Cat is eating fish.
四、特殊方法1、 __init__方法__init__方法是指類(lèi)的構(gòu)造方法,它在類(lèi)實(shí)例化時(shí)自動(dòng)調(diào)用
,用于初始化對(duì)象的屬性
。在Python中,可以使用__init__方法來(lái)定義類(lèi)的構(gòu)造方法
。
class MyClass: def __init__(self, name): self.name = name# 實(shí)例化對(duì)象obj = MyClass("world")# 訪問(wèn)對(duì)象的屬性print(obj.name) # 輸出:world
2、__str__方法
__str__方法是指類(lèi)的字符串表示方法
,它可以將類(lèi)對(duì)象轉(zhuǎn)換為字符串類(lèi)型
,用于打印對(duì)象時(shí)的輸出。在Python中
,可以使用__str__方法來(lái)定義類(lèi)的字符串表示方法
。
class MyClass: def __init__(self, name): self.name = name def __str__(self): return "MyClass(name=" + self.name + ")"# 實(shí)例化對(duì)象obj = MyClass("world")# 打印對(duì)象print(obj) # 輸出:MyClass(name=world)
3、其他常用的特殊方法在Python中
,還有許多其他常用的特殊方法
,如__eq__方法用于判斷兩個(gè)對(duì)象是否相等
,__lt__方法用于判斷一個(gè)對(duì)象是否小于另一個(gè)對(duì)象
,__len__方法用于獲取對(duì)象的長(zhǎng)度等。五
、訪問(wèn)控制1
、公有、私有和保護(hù)成員
在Python中
,可以使用下劃線(_)來(lái)定義公有
、私有和保護(hù)成員。公有成員是指可以被任何對(duì)象訪問(wèn)的成員
,私有成員是指只能被類(lèi)內(nèi)部訪問(wèn)的成員
,保護(hù)成員是指只能被類(lèi)內(nèi)部和子類(lèi)訪問(wèn)的成員。
class MyClass: def __init__(self, name, age): self.name = name # 公有成員 self._age = age # 保護(hù)成員 self.__gender = "male" # 私有成員 def say_hello(self): print("Hello, " + self.name + "!") def get_gender(self): return self.__gender# 實(shí)例化對(duì)象obj = MyClass("Tom", 18)# 訪問(wèn)對(duì)象的屬性和方法print(obj.name) # 輸出:Tomprint(obj._age) # 輸出:18print(obj.get_gender()) # 輸出:maleprint(obj.__gender) # 報(bào)錯(cuò):AttributeError: "MyClass" object has no attribute "__gender"
2、訪問(wèn)控制的實(shí)現(xiàn)方式
在Python中
,訪問(wèn)控制并不是強(qiáng)制性的,只是一種約定俗成的規(guī)范
。如果希望強(qiáng)制實(shí)現(xiàn)訪問(wèn)控制,可以使用屬性裝飾器@property
、@屬性名.setter和@屬性名.deleter來(lái)限制屬性的訪問(wèn)
。
class MyClass: def __init__(self, name, age): self.name = name self._age = age @property def age(self): return self._age @age.setter def age(self, value): if value < 0: raise ValueError("Age cannot be negative.") self._age = value @age.deleter def age(self): del self._age# 實(shí)例化對(duì)象obj = MyClass("Tom", 18)# 訪問(wèn)對(duì)象的屬性print(obj.name) # 輸出:Tomprint(obj.age) # 輸出:18# 修改對(duì)象的屬性obj.age = 20print(obj.age) # 輸出:20# 刪除對(duì)象的屬性del obj.ageprint(obj.age) # 報(bào)錯(cuò):AttributeError: "MyClass" object has no attribute "_age"
六、代碼示例下面是一個(gè)完整的示例代碼
,包括類(lèi)和對(duì)象的定義和使用
、繼承和多態(tài)的實(shí)現(xiàn)
、抽象類(lèi)和接口的定義和實(shí)現(xiàn)
、特殊方法和訪問(wèn)控制的實(shí)現(xiàn)。
from abc import ABC, abstractmethod# 定義動(dòng)物類(lèi)class Animal(ABC): def __init__(self, name): self.name = name @abstractmethod def eat(self): pass# 定義貓類(lèi)class Cat(Animal): def __init__(self, name, color): super().__init__(name) self.color = color def eat(self): print(self.name + " is eating fish.") def __str__(self): return "Cat(name=" + self.name + ", color=" + self.color + ")"# 定義狗類(lèi)class Dog(Animal): def __init__(self, name, breed): super().__init__(name) self.breed = breed def eat(self): print(self.name + " is eating meat.") def __str__(self): return "Dog(name=" + self.name + ", breed=" + self.breed + ")"# 定義接口類(lèi)class IShout(ABC): @abstractmethod def shout(self): pass# 定義黃狗類(lèi)class YellowDog(Dog, IShout): def __init__(self, name, breed): super().__init__(name, breed) def shout(self): print(self.name + " is shouting: Wow, wow!") def __str__(self): return "YellowDog(name=" + self.name + ", breed=" + self.breed + ")"# 實(shí)例化對(duì)象cat = Cat("Tom", "white")dog = Dog("Spike", "bulldog")yellow_dog = YellowDog("Charlie", "golden retriever")# 調(diào)用方法cat.eat() # 輸出:Tom is eating fish.dog.eat() # 輸出:Spike is eating meat.yellow_dog.eat() # 輸出:Charlie is eating meat.yellow_dog.shout() # 輸出:Charlie is shouting: Wow, wow!# 輸出對(duì)象的字符串表示print(cat) # 輸出:Cat(name=Tom, color=white)print(dog) # 輸出:Dog(name=Spike, breed=bulldog)print(yellow_dog) # 輸出:YellowDog(name=Charlie, breed=golden retriever)
關(guān)鍵詞: