python入門(十四):面向對象(屬性、方法、繼承)
阿新 • • 發佈:2019-04-23
mage eat div 實例變量 統一 object 地址 面向對象 實例方法 任何東西
1)屬性(特征:通常可以用數據來描述)
(類變量和實例變量)
2)可以做一些動作(方法)
類來管理對象的數據。
屬性:類變量和實例變量(私有變量)
方法:
1)實例方法
2)類方法
3)靜態方法 面向對象和函數管理數據:
類:
專有數據(可以存儲,和對外使用)
方法(用於操作專有數據的),實現操作數據的規則。
函數:
無專有數據,誰給他傳值都可以處理,並返回
本身不能存儲數據。
把一組相關數據放到類的實例裏面,進行存儲、計算等
實現安全性、獨立性,規則的操作統一。 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來聲明,可以沒有參數,
使用類變量,不能使用實例變量。
通過類名或者實例對象調用。
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__構造方法,會自動調用父類的。
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):三種類的定義方法等價
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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
#print(Person("吳老師","Male").get_name())#只能使用一次(連著寫,沒有存到變量裏,使用一次就消失了)
wulaoshi = Person("吳老師","Male")#實例化
print(wulaoshi.get_name()) ---------------- class Person:
count = 0 #類變量
def __init__(self,name,gender):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
#類方法:可以使用類變量,不能使用實例變量(參數沒有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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
Person.count +=1
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
#類方法:可以使用類變量,不能使用實例變量
#通過類名來使用,類名.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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
Person.count +=1
print("創建了一個新的人")
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
class ChinaPerson(Person):
pass #如果子類沒有定義__init__構造方法
#會自動調用父類的。
cp = ChinaPerson("吳老師","男")
print(
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
print(cp.gender)
print(cp.get_name())
print(cp.count)
繼承:子類具備所有父類的共有變量和共有方法
如果子類沒有定義__init__構造方法,會自動調用父類的。
"""
繼承:子類具備所有父類的共有變量和共有方法
如果子類沒有定義__init__構造方法,會自動調用父類的。
好處:站在老爸的肩膀上,增加屬性,增加方法
在原有的基礎上進行擴展。
"""
擴展 class Person:
count = 0 #類變量
nation = "中國"
def __init__(self,name,gender):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
Person.count +=1
print("創建了一個新的人")
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
Person.count +=1
print("創建了一個新的人")
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
self.gender = gender
Person.count +=1
print("創建了一個新的人")
def get_name(self):#實例方法,必須要實例化
return
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
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):
![技術分享圖片](file:///C:\Users\binbin\AppData\Roaming\Tencent\QQ\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)
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)
子類的構造函數,如果沒有實現,則調用第一個基類的構造
函數。
"""
多繼承的時候同名方法,會進行深度優先的查找。
![技術分享圖片](http://image.bubuko.com/info/201904/20190423105016497405.png)
從父類、爺爺類去查找方法,叫做深度優先
從多繼承的同級類去查找方法,叫做廣度優先 p -->get_name(爺爺類)
Person(父類) Bird-->get_name(父類)
ChinaBirdPerson(孫類)
cp.get_name() class P: class P(): class P(object):三種類的定義方法等價
python入門(十四):面向對象(屬性、方法、繼承)