廣東工廠網(wǎng)站建設(shè)sem是什么公司
1、什么是面向?qū)ο?/h2>
面向?qū)ο蠓Q為OO,他通過將數(shù)據(jù)和功能封裝在一個(gè)被稱為‘對(duì)象’的實(shí)體中,來(lái)組織和管理代碼。面向?qū)ο笞兂?#xff08;OOP)具有四個(gè)特性,封裝、繼承、多態(tài)、抽象
優(yōu)點(diǎn):模塊化、安全性高、代碼重用性高
缺點(diǎn):學(xué)習(xí)難度大、性能開銷大、調(diào)試?yán)щy
2、類和對(duì)象
Python中的一切都是對(duì)象,類也是一個(gè)對(duì)象,Python 的內(nèi)置類型也都是對(duì)象--內(nèi)置對(duì)象,對(duì)象的抽象是類,類可以實(shí)例化若干個(gè)對(duì)象
2.1類的定義
語(yǔ)法格式1:
class ClassA:# 公共的屬性def __init__(self):passdef fun1(self):passdef fun2(self):pass語(yǔ)法格式2:
class ClassA(object):# 公共的屬性def __init__(self):passdef fun1(self):passdef fun2(self):pass實(shí)例化對(duì)象的語(yǔ)法:1》無(wú)參對(duì)象名 = 類名()2》有參對(duì)象名 = 類名(參數(shù)列表)
2.2類的屬性
Python中類的屬性分為兩種,類屬性和實(shí)例屬性
2.2.1類屬性
定義在類級(jí)別上的變量,與類本身相關(guān)聯(lián),不與任何特定實(shí)例相關(guān)聯(lián),所有實(shí)例共享同一個(gè)類屬性的值,除非在某個(gè)實(shí)例改變他的值
2.2.2實(shí)例屬性
實(shí)例屬性是與類的特定實(shí)例相關(guān)聯(lián)的變量。每個(gè)實(shí)例都有自己獨(dú)立的實(shí)例屬性,即使這些實(shí)例屬于同一個(gè)類。實(shí)例屬性通常在實(shí)例的構(gòu)造方法(__init__
)中定義,使用self
關(guān)鍵字來(lái)引用當(dāng)前實(shí)例。
class stu():grade = 'py24101'def __init__(self, name, age):self.name = nameself.age=agedef study(self):print(f'{self.name}愛學(xué)習(xí)')def play(self):print(f'{self.name}玩游戲')
s1=stu('張三',18)
print(stu.grade)
print(s1.grade,s1.name)
注意事項(xiàng)
-
類屬性通常用于存儲(chǔ)那些對(duì)類所有實(shí)例都相同的值。如果需要在實(shí)例之間共享數(shù)據(jù),并且這些數(shù)據(jù)在實(shí)例的生命周期內(nèi)不會(huì)改變,那么類屬性可能是一個(gè)好的選擇。
-
實(shí)例屬性用于存儲(chǔ)與特定實(shí)例相關(guān)的數(shù)據(jù)。它們使得每個(gè)實(shí)例都可以有自己的狀態(tài)和行為。
-
當(dāng)通過實(shí)例訪問屬性時(shí),Python會(huì)首先查找實(shí)例屬性。如果實(shí)例屬性不存在,它會(huì)查找類屬性。這意味著如果類屬性和實(shí)例屬性同名,實(shí)例屬性會(huì)“隱藏”類屬性。
-
盡量避免在實(shí)例方法中修改類屬性,因?yàn)檫@可能會(huì)導(dǎo)致意外的行為,特別是當(dāng)你有多個(gè)實(shí)例時(shí)。如果確實(shí)需要修改類屬性的值,請(qǐng)確保你了解這樣做的后果。
2.3對(duì)象和類的關(guān)系
-
對(duì)象擁有類的所有屬性和方法
-
對(duì)象的屬性和方法可以單獨(dú)添加、刪除、修改
-
對(duì)象與對(duì)象之間的屬性和方法不可共享
-
對(duì)象不能獨(dú)自創(chuàng)建,必須依托于類,類可以實(shí)例化N個(gè)對(duì)象
class Stu(object):id = '1001'name = '張三'def fun1(self):pass# 實(shí)例化對(duì)象
s1 = Stu()
s2 = Stu()
# 對(duì)象的屬性可以單獨(dú)修改、添加、刪除
s1.name = '李四'
s1.age = 18
del s1.age
print(s1.name)
# print(s1.age)
print(s2.name)
# print(s2.age)
還可以使用以下函數(shù)的方式來(lái)訪問屬性
-
getattr(obj, name[, default]) : 訪問對(duì)象的屬性。
-
hasattr(obj,name) : 檢查是否存在一個(gè)屬性。
-
setattr(obj,name,value) : 設(shè)置一個(gè)屬性。如果屬性不存在,會(huì)創(chuàng)建一個(gè)新屬性。
-
delattr(obj, name) : 刪除屬性。
2.4魔方方法---構(gòu)造函數(shù)與析構(gòu)函數(shù)
-
__init__ 構(gòu)造函數(shù):完成對(duì)象的初始化工作,方便統(tǒng)一管理、調(diào)用類創(chuàng)建對(duì)象時(shí),自動(dòng)執(zhí)行。
-
__del__ 析構(gòu)函數(shù):刪除對(duì)象時(shí)執(zhí)行一些操作,自動(dòng)執(zhí)行。
-
__str__ 打印方法:輸出執(zhí)行信息,自動(dòng)執(zhí)行。
class car():def __init__(self,name,color):self.name=nameself.color=colordef __str__(self):return f"logo{self.name},color{self.color}"def __del__(self):print( f"{self.name}boom,go home")c1=car('保時(shí)捷','red')
c2=car('xiaomisu7','white')
print(c1.name,c2.name)
print(c1)
print(c2)
2.5類方法、實(shí)例方法、靜態(tài)方法
class Student(object):"""定義了一個(gè)學(xué)生類"""grade = 'py24101'@classmethod#類方法def cls_fun(cls):"""類方法中只能調(diào)用類屬性和類方法"""print(f"班級(jí)名稱是{cls.grade}")def __init__(self, name, age):self.name = nameself.age = agedef fun1(self):"""實(shí)例方法中能調(diào)用類屬性、實(shí)例屬性"""print(f"實(shí)例方法中輸出類屬性{self.grade}, 輸出實(shí)例屬性{self.name}")@staticmethod#靜態(tài)方法def sta_fun(x):print(f"{x}靜態(tài)方法一般實(shí)現(xiàn)與類和對(duì)象無(wú)關(guān)聯(lián)的操作,例如:游戲說明書等")s1 = Student('張三', 18)
# 如何調(diào)用類方法
Student.cls_fun()
s1.cls_fun()# 如何調(diào)用實(shí)例方法
Student.fun1(s1)
s1.fun1()# 如何調(diào)用靜態(tài)方法
Student.sta_fun(3)
s1.sta_fun(3)
2.6Python的內(nèi)置屬性
-
__dict__ : 類的屬性(包含一個(gè)字典,由類的數(shù)據(jù)屬性組成)
-
__doc__ :類的文檔字符串
-
__name__: 類名
-
__module__: 類定義所在的模塊(類的全名是'__main__.className',如果類位于一個(gè)導(dǎo)入模塊mymod中,那么className.__module__ 等于 mymod)
-
__bases__ : 類的所有父類構(gòu)成元素(包含了一個(gè)由所有父類組成的元組)
3、封裝
封裝是類的三大特性之一。
封裝指的是隱藏對(duì)象中一些不希望讓外部所訪問的屬性或方法。
python中封裝其實(shí)是通過設(shè)置訪問權(quán)限來(lái)體現(xiàn)的,私有屬性和私有方法是控制訪問權(quán)限的組成部分。
3.1私有屬性
class Bank(object):"""定義了一個(gè)銀行卡類屬性:name pwd密碼【我不希望外部訪問】"""def __init__(self, name, pwd):self.name = nameself.__pwd = pwd# 為了在某些需要的時(shí)候,訪問到私有屬性,所以需要在類內(nèi)部設(shè)置兩個(gè)接口def get_pwd(self):return self.__pwddef set_pwd(self, newpwd):self.__pwd = newpwd# print(Bank.__pwd)b1 = Bank('張三', '123456')
print(b1.name)
# print(b1.__pwd)
print(b1.get_pwd())
b1.set_pwd('666888')
print(b1.get_pwd())
3.2私有方法
class Bank(object):"""定義了一個(gè)銀行卡類屬性:name pwd密碼【我不希望外部訪問】"""def __init__(self, name, pwd):self.name = nameself.__pwd = pwddef __info(self):print(f"名字{self.name}, 密碼{self.__pwd}")def get_info(self):self.__info()# Bank.__info() 報(bào)錯(cuò)
b1 = Bank('李四', '123456')
# b1.__info() 報(bào)錯(cuò)
b1.get_info()
3.3屬性裝飾器
把方法轉(zhuǎn)為屬性
class car():def __init__(self, name, color):self.name = nameself.color = colorself.__num = 20@propertydef num(self):return self.__num@num.setterdef num(self, x):if not isinstance(x,int):print('油量必須是數(shù)字')else:self.__num += x@num.deleterdef num(self):print("刪除油量")del self.__numc1 = car('法拉利', 'red')
print(c1.name, c1.color, c1.num)
c1.num = 'win32'
print(c1.num)
del c1.num
4.類的繼承
面向?qū)ο蟮木幊處?lái)的主要好處之一就是代碼的重用,實(shí)現(xiàn)這種重用的方法之一就是通過繼承機(jī)制。
通過繼承創(chuàng)建的新類稱之為【子類】或者【派生類】,被繼承的類稱之為【父類】、【基類】、【超類】
4.1語(yǔ)法格式
class Parent():par_attr=100def __init__(self):print('初始化父類')def par_fun(self):print('父類方法一')def par_dun(self):print('父類方法二')
class Child(Parent):chi_attr=10def __init__(self):print('初始化子類')def chi_dun(self):print('子類方法一')def chi_fun(self):print('子類方法二')
c1=Child()
c1.par_dun()
c1.chi_dun()
p1=Parent()
p1.par_dun()
4.2多繼承
class A:pass
class B:pass
class C:pass
class D(A,B,C):pass
d1=D()
print(D.mro())
print(D.__bases__)
這里列出了一些通用的功能,可以在自己的類重寫:
-
__init__ ( self [,args...] ) 構(gòu)造函數(shù) 簡(jiǎn)單的調(diào)用方法: obj = className(args)
-
__del__( self ) 析構(gòu)方法, 刪除一個(gè)對(duì)象 簡(jiǎn)單的調(diào)用方法 : del obj
-
__repr__( self ) 轉(zhuǎn)化為供解釋器讀取的形式 簡(jiǎn)單的調(diào)用方法 : repr(obj)
-
__str__( self ) 用于將值轉(zhuǎn)化為適于人閱讀的形式 簡(jiǎn)單的調(diào)用方法 : str(obj)
-
__cmp__ ( self, x ) 對(duì)象比較 簡(jiǎn)單的調(diào)用方法 : cmp(obj, x)
class Parent():def __init__(self,x,y):self.x=xself.y=ydef add(self):return self.x+self.y
class Child(Parent):def __init__(self,x,y,z):super().__init__(x,y)self.z=zdef add(self):return super().add()+self.z
c=Child(1,2,3)
print(c.add())
4.3運(yùn)算符重載
在Python中,并沒有像其他語(yǔ)言(如C++)中那樣的內(nèi)置機(jī)制來(lái)重載運(yùn)算符。但是,你可以通過定義特定的方法來(lái)模擬運(yùn)算符重載的行為。
以下是一些常見運(yùn)算符以及它們對(duì)應(yīng)的特殊方法:
加法:+ 對(duì)應(yīng) __add__
減法:- 對(duì)應(yīng) __sub__
乘法:* 對(duì)應(yīng) __mul__
除法:/ 對(duì)應(yīng) __truediv__
取模:% 對(duì)應(yīng) __mod__
冪運(yùn)算:** 對(duì)應(yīng) __pow__
位運(yùn)算:
位運(yùn)算:>> 對(duì)應(yīng) __rshift__
位運(yùn)算:& 對(duì)應(yīng) __and__
位運(yùn)算:| 對(duì)應(yīng) __or__
位運(yùn)算:^ 對(duì)應(yīng) __xor__
class op():def __init__(self,x,y):self.x=xself.y=ydef __add__(self, other):return (self.x+other.x)**2-self.y-other.y
o1=op(1,3)
o2=op(5,7)
print(o1+o2)
5.多態(tài)
class Animal(object):name = '動(dòng)物'age = 0def speak(self):print("動(dòng)物的聲音")class Dog(Animal):def speak(self):print("汪汪汪")class Cat(Animal):def speak(self):print("喵喵喵")a = Animal()
d = Dog()
c = Cat()a.speak()
d.speak()
c.speak()
6.關(guān)于下劃線說明
-
__foo__: 以雙下劃線開頭雙下劃線結(jié)尾,定義的是特殊方法,一般是系統(tǒng)定義名字 ,類似 __init__() 之類的,自動(dòng)。
-
_foo: 以單下劃線開頭的表示的是 protected 類型的變量,即保護(hù)類型只能允許其本身與子類進(jìn)行訪問,不能用于 from module import ···
-
__foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個(gè)類本身進(jìn)行訪問了。