oop程式設計是利用「類」和「物件」來建立各種模型來實現對真實世界的描述,使用物件導向程式設計的原因一方面是因為它可以使程式的維護和擴充套件變得更簡單,並且可以大大提高程式開發效率 ,另外,基於物件導向的程式可以使它人更加容易理解你的**邏輯,從而使團隊開發變得更從容
class foo: # 定義乙個類,class(關鍵字)
def __init__(self, name): # 初始化方法(構造方法)
self.name = name # self 是物件自己
def say_hello(self): # 普通方法
print(f'hello:')
obj = foo('otis') # 例項化乙個物件
obj.say_hello() # 呼叫普通方法
我們並沒有呼叫init(self,…)
,但它會自動執行,因為它叫初始化方法(構造方法),就是在例項化完成的時候,用來初始化一些資料的,比如初始化你例項的名字、年齡等屬性
封裝,顧名思義就是將內容封裝到某個地方,以後再去呼叫被封裝在某處的內容。
class foo:
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(f'你的名字是,年齡是')
obj = foo('otis', 20) # 將 otis 和 20 封裝到 obj 物件中
print(obj.name) # 通過物件直接呼叫
print(obj.age)
obj.info() # 通過類中的方法呼叫
# 當物件呼叫類中的普通方法時,python自動會將當前物件傳遞給該方法
# 即 info 當中的 self 就是 obj
封裝的優點
封裝原則
私有變數和私有方法
class a:
# 類的資料屬性就應該是共享的,但是語法上是可以把類的資料屬性設定成私有的如__n,會變形為_a__n
__n = 0
def __init__(self):
self.__x = 10 # 變形為self._a__x
def __foo(self): # 變形為_a__foo
print('from a')
def bar(self):
self.__foo() # 只有在類內部才可以通過__foo的形式訪問到.
# a._a__n是可以訪問到的,即這種操作並不是嚴格意義上的限制外部訪問,僅僅只是一種語法意義上的變形
繼承,物件導向中的繼承和現實生活中的繼承相同,即:子可以繼承父的內容。
例如:正常情況,要分別為2類動物建立乙個類,並實現他們的吃,喝,叫功能
使用繼承可以將類共有的方法提取出來(父類),只要子類繼承父類就能擁有父類的方法
class animal:
def eat(self):
print(f' 在吃東西')
def drink(self):
print(f' 在喝東西')
class cat(animal):
def __init__(self, name):
self.name = name
self.species = '貓'
def say(self):
print('喵喵喵')
class dog(animal):
def __init__(self, name):
self.name = name
self.species = '狗'
def say(self):
print('汪汪汪')
cat1 = cat('小咪')
dog1 = dog('旺財')
cat1.say()
dog1.eat()
多繼承
python的類如果繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先和c3演算法(廣度優先)
在python2中當前類或父類沒有繼承object類就是經典類,否則否則就是新式類
在python3中不管有沒有繼承object類都是新式類
經典類多繼承
class d:
def bar(self):
print 'd.bar'
class c(d):
def bar(self):
print 'c.bar'
class b(d):
def bar(self):
print 'b.bar'
class a(b, c):
def bar(self):
print 'a.bar'
a = a()
# 執行bar方法時
# 首先去a類中查詢,如果a類中沒有,則繼續去b類中找,如果b類中麼有,則繼續去d類中找,如果d類中麼有,則繼續去c類中找,如果還是未找到,則報錯
# 所以,查詢順序:a --> b --> d --> c
# 在上述查詢bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
a.bar()
新式類多繼承class d(object):
def bar(self):
print 'd.bar'
class c(d):
def bar(self):
print 'c.bar'
class b(d):
def bar(self):
print 'b.bar'
class a(b, c):
def bar(self):
print 'a.bar'
a = a()
# 執行bar方法時
# 首先去a類中查詢,如果a類中沒有,則繼續去b類中找,如果b類中麼有,則繼續去c類中找,如果c類中麼有,則繼續去d類中找,如果還是未找到,則報錯
# 所以,查詢順序:a --> b --> c --> d
# 在上述查詢bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
a.bar()
class a:
def func(self):
pass
class b(a):
def func(self):
print('b')
class c(a):
def func(self):
print('c')
def func(obj: a):
obj.func()
b = b()
c = c()
func(b)
func(c)
物件導向(一)
當new去呼叫乙個函式 函式中的this就是建立出來的物件,並且函式的返回值就是this 隱式返回 function createperson name var p1 new createperson 張三 p1.showname var p2 new createperson 李四 p2.show...
物件導向(一)
1 什麼是物件導向 物件導向程式設計 object oriented programming.oop 物件導向程式設計的本質就是 以類的方式組織 以物件的形式組織 封裝 資料。類是一種抽象的資料型別,它是對某一類事物整體描述 定義,但是並不能代表某乙個具體的事務 1 使用new關鍵字建立物件 2 使...
設計模式 物件導向一 物件導向
什麼是物件導向程式設計?物件導向程式設計是一種程式設計正規化和程式設計風格。它以類或物件作為組織 的基本單元,並將封裝 抽象 繼承 多型四個特性,作為 設計和實現的基石 什麼是物件導向程式設計語言?物件導向程式設計語言是支援類或物件的語法機制,並有現成的語法機制,能方便的實現物件導向程式設計四大特性...