1. 程式人生 > >python入門(十四):面向對象(屬性、方法、繼承)

python入門(十四):面向對象(屬性、方法、繼承)

mage eat div 實例變量 統一 object 地址 面向對象 實例方法

任何東西
1)屬性(特征:通常可以用數據來描述)
(類變量和實例變量)
2)可以做一些動作(方法)

類來管理對象的數據。
屬性:類變量和實例變量(私有變量)
方法:
1)實例方法
2)類方法
3)靜態方法 面向對象和函數管理數據:
類:
專有數據(可以存儲,和對外使用)
方法(用於操作專有數據的),實現操作數據的規則。

函數:
無專有數據,誰給他傳值都可以處理,並返回
本身不能存儲數據。

class compute:

def __init__(self,a,b):
self.a = a
self.b = b

def add(self):

return self.a+self.b

def add(a,b):
return a+b

#print(add(1,2))
c= compute(1,2)
print(c.add())

c.a+=1
c.b+=1
print(c.a)
print(c.b)

類:作為一個整體,
把一組相關數據放到類的實例裏面,進行存儲、計算等
實現安全性、獨立性,規則的操作統一。 class Person:

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

#print(Person("吳老師","Male").get_name())#只能使用一次(連著寫,沒有存到變量裏,使用一次就消失了)
wulaoshi = Person("吳老師","Male")#實例化
print(wulaoshi.get_name()) ---------------- class Person:
count = 0 #類變量

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

#類方法:可以使用類變量,不能使用實例變量(參數沒有self,找不到實例的地址,因此不能用實例變量。) #通過類名來使用,類名.get_instance_count() #也可以通過實例調用,實例對象.get_instance_count() @classmethod
def get_instance_count(cls):
return Person.count


#只能使用一次
#print(Person("吳老師","Male").get_name())
#wulaoshi = Person("吳老師","Male")#實例化
#print(wulaoshi.get_name())
print(Person.count)
Person("吳老師","Male")
print(Person.count)
print(Person.get_instance_count()) print(Person("吳老師","Male").get_instance_count())#通過實例對象調用類方法 靜態方法 class Person:
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

#類方法:可以使用類變量,不能使用實例變量
#通過類名來使用,類名.get_instance_count()
#也可以通過實例調用,實例對象.get_instance_count()
@classmethod
def get_instance_count(cls):
return Person.count

@classmethod
def create_a_instance(cls):
return Person("張","女")

@staticmethod #靜態方法:不需要self和cls
def get_nation():
return Person.nation


#只能使用一次
#print(Person("吳老師","Male").get_name())
#wulaoshi = Person("吳老師","Male")#實例化
#print(wulaoshi.get_name())
#print(Person.count)
#Person("吳老師","Male")
#print(Person.count)
#print(Person.get_instance_count())
#print(Person.create_a_instance())
#print(Person("吳老師","Male").get_instance_count())
print(Person.get_nation())
print(Person("吳老師","Male").get_nation()) 三種方法的區別:
1 實例方法,參數要有self,必須通過實例化的對象去調用。
2 類方法,要加上@classmethod來聲明,參數至少有一個,
一般定義為cls,只能使用類變量,不能使用實例變量。
通過類名或者實例對象調用。
3 靜態方法,要加上@staticmethod來聲明,可以沒有參數,
使用類變量,不能使用實例變量。
通過類名或者實例對象調用。

不想做實例化,且只操作類變量:類方法、靜態方法
如果想使用實例變量,只能使用實例方法了。

@staticmethod #靜態方法:不需要self和cls
def get_more():
Person.count +=100
return Person.count
print(Person("吳老師","Male").get_more()) 單繼承 class Person:
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1
print("創建了一個新的人")

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

class ChinaPerson(Person):
pass #如果子類沒有定義__init__構造方法
#會自動調用父類的。

cp = ChinaPerson("吳老師","男")
print(技術分享圖片cp.name)
print(cp.gender)
print(cp.get_name())
print(cp.count)
繼承:子類具備所有父類的共有變量和共有方法
如果子類沒有定義__init__構造方法,會自動調用父類的。

"""
繼承:子類具備所有父類的共有變量和共有方法
如果子類沒有定義__init__構造方法,會自動調用父類的。
好處:站在老爸的肩膀上,增加屬性,增加方法
在原有的基礎上進行擴展。
"""

擴展 class Person:
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1
print("創建了一個新的人")

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

class ChinaPerson(Person):
#如果子類沒有定義__init__構造方法
#會自動調用父類的。
def __init__(self,name,gender):
Person.__init__(self,name,gender)

def get_gender(self):
return self.gender

cp = ChinaPerson("吳老師","男")
print(cp.count) 多繼承 ---------- class Person:
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1
print("創建了一個新的人")

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

class Bird:

def __init__(self,color):
print("a bird is birthed!")
self.color = color

def fly(self):
print("I can fly in the sky!")

class ChinaBirdPerson(Person,Bird):
#如果子類沒有定義__init__構造方法
#會自動調用父類的。


def get_gender(self):
return self.gender

cp = ChinaBirdPerson("吳老師","男")
print(cp.color)

"""
繼承:子類具備所有父類的共有變量和共有方法
如果子類沒有定義__init__構造方法,會自動調用父類的。
好處:站在老爸的肩膀上,增加屬性,增加方法
在原有的基礎上進行擴展。

多繼承:在括號裏面寫上多個基類(父類)
子類的構造函數,如果沒有實現,則調用第一個基類的構造
函數。
""" ------------- class Person:
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1
print("創建了一個新的人")

def get_name(self):#實例方法,必須要實例化
return 技術分享圖片self.name

class Bird:

def __init__(self,color):
print("a bird is birthed!")
self.color = color

def fly(self):
print("I can fly in the sky!")

class ChinaBirdPerson(Person,Bird):
#如果子類沒有定義__init__構造方法
#會自動調用父類的。
def __init__(self,name,gender,color):
Person.__init__(self,name,gender)
Bird.__init__(self,color)

def get_gender(self):
return self.gender

cp = ChinaBirdPerson("吳老師","男","紅色")
print(cp.color)
print(cp.get_name())
print(cp.fly()) java裏面是沒有多繼承的,但是有多個接口 class Person:
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1
print("創建了一個新的人")



class Bird:

def __init__(self,color):
print("a bird is birthed!")
self.color = color

def fly(self):
print("I can fly in the sky!")

def get_name(self):#實例方法,必須要實例化
return "bird has no name"

class ChinaBirdPerson(Person,Bird):
#如果子類沒有定義__init__構造方法
#會自動調用父類的。
def __init__(self,name,gender,color):
Person.__init__(self,name,gender)
Bird.__init__(self,color)

def get_gender(self):
return self.gender

cp = ChinaBirdPerson("吳老師","男","紅色")
print(cp.get_name()) --------------- class ChinaBirdPerson(Person,Bird):
#如果子類沒有定義__init__構造方法
#會自動調用父類的。
def __init__(self,name,gender):
Person.__init__(self,name,gender)
#Bird.__init__(self,color)

def get_gender(self):
return self.gender

cp = ChinaBirdPerson("吳老師","男")
print(cp.color) p -->get_name
Person Bird-->get_name
ChinaBirdPerson

cp.get_name() py3都是新式類,深度優先,沒有經典類 class P:
#def get_name(self):
# return "P name!"
pass

class Person(P):
count = 0 #類變量
nation = "中國"

def __init__(self,name,gender):
技術分享圖片self.name = name
self.gender = gender
Person.count +=1
print("創建了一個新的人")



class Bird:

def __init__(self,color):
print("a bird is birthed!")
self.color = color

def fly(self):
print("I can fly in the sky!")

def get_name(self):#實例方法,必須要實例化
return "bird has no name"

class ChinaBirdPerson(Person,Bird):
#如果子類沒有定義__init__構造方法
#會自動調用父類的。
def __init__(self,name,gender):
Person.__init__(self,name,gender)
#Bird.__init__(self,color)

def get_gender(self):
return self.gender

cp = ChinaBirdPerson("吳老師","男")
print(cp.get_name())



"""
繼承:子類具備所有父類的共有變量和共有方法
如果子類沒有定義__init__構造方法,會自動調用父類的。
好處:站在老爸的肩膀上,增加屬性,增加方法
在原有的基礎上進行擴展。

多繼承:在括號裏面寫上多個基類(父類)ChinaBirdPerson(Person,Bird)
子類的構造函數,如果沒有實現,則調用第一個基類的構造
函數。
"""
多繼承的時候同名方法,會進行深度優先的查找。 技術分享圖片 MRO方法解析表確實P在在前面
從父類、爺爺類去查找方法,叫做深度優先
從多繼承的同級類去查找方法,叫做廣度優先 p -->get_name(爺爺類)
Person(父類) Bird-->get_name(父類)
ChinaBirdPerson(孫類)

cp.get_name() class P: class P(): class P(object):三種類的定義方法等價

python入門(十四):面向對象(屬性、方法、繼承)