1.面向物件的思想優點
優點: 簡化代碼 ,構建公共模板 ,擴展性強
思想: 類作為模板 ,物件通過模板實體化物件 ,物件去做事 ,抽象將顯示存在的事物使用代碼體現
2.三大特性
封裝(狹義) : 對屬性的封裝 ,對方法的封裝
繼承
1.子類擁有父類除私有內容外所有
2.物件通過子類-父類-...找到自己所需要的屬性方法
3.py3默認繼承object是新式類 , 使用c3演算法 ,print(型別.mro()) 判斷類名,查看多繼承的繼承順序
4.super().方法 ,可以呼叫父類的同名方法
class Base: def __init__(self): print('BASE') class A(Base): def __init__(self): super().__init__() print('A') class B(Base): def __init__(self): super().__init__() print('B') class C(A, B): def __init__(self): super().__init__() print('C') C() print(C.mro()) # 按照這個演算法順序,確定某個類的繼承順序
多型
3.成員
屬性 (__dict__查看)
物件的屬性
類的屬性
方法 (dir()查看)
普通方法
類方法 :@classmethod
靜態方法 :@staticmethod 放在類中的普通函式
屬性 (方法偽裝屬性)
很多方法執行后獲得的是一個結果 ,不像一個動作
@property #偽裝屬性
@方法名.setter #根據傳入的values ,來改變屬性的回傳值
私有成員
僅內部可以呼叫的變數或方法 ,私有屬性,私有類方法,私有物件屬性
self與cls
self形參是物件本身 ,當物件實體化之后 ,呼叫時將物件的記憶體地址給self
cls形參是類本身
class Person: local = '地球' # 私有類屬性 __character__ = '積極向上' def __init__(self, name, ad, hp, character): self.name = name self.ad = ad self.hp = hp # 私有物件屬性 self.__character__ = character # 私有類方法 def __local__(cls): print(cls.__character__) # 類方法 @classmethod def Dict(cls): return cls.__dict__ # 靜態方法 @staticmethod def Sum(n): return n + 2 # 屬性Info @property def Info(self): return '{}-{}-{}'.format(self.name, self.ad, self.hp) # 修改屬性Info @Info.setter def Info(self, values): if values < 100: self.ad = values print(Person.__character__) print(Person.Dict()) print(Person.Sum(2)) obj1 = Person('lucy', 10, 50, '積極向左') print(obj1.Info) obj1.Info = 99 print(obj1.Info)
4.物件的行為
實體化物件
1.__new__方法在記憶體開辟空間創建物件
2.執行__init__方法初始化物件
物件呼叫屬性與方法的順序
優先在記憶體中尋找-->物件內部封裝-->類-->父類
5.類與類之間的關系
依賴關系 : 相互依存性較低 ,就是一個類中需要執行動作時 ,需要其他類中的方法屬性去幫助完成 ,一般通過引數將物件進行呼叫
class Eat:
def handler(self, *args):
for i in args:
i.eat()
class Apple:
def eat(self):
print('吃蘋果')
class Pear:
def eat(self):
print('吃梨')
obj = Eat()
obj1 = Apple()
obj2 = Pear()
obj.handler(obj1, obj2)
關聯關系 : 兩種事物必須是互相關聯的. 但是在某些特殊情況下是可以更改和更換的.
class Country:
def __init__(self, name):
self.name = name
self.pro_list = []
def add_pro(self, pro):
self.pro_list.append(pro)
def show_pro(self):
for i in self.pro_list:
print(i.name, i.cou)
class province:
def __init__(self, name, country):
self.name = name
self.cou = country
C1 = Country('火星國')
p1 = province('省1', C1.name)
p2 = province('省2', C1.name)
C1.add_pro(p1)
C1.add_pro(p2)
C1.show_pro()
繼承關系 :就是繼承父類非私有屬性方法 ,self會先從物件中尋找方法屬性 ,當沒有的時候會去父類中尋找
6.介面類(約束抽象)
介面類是繼承的一個用法 ,繼承可以讓子類擁有父類的代碼 ,防止代碼重復 ,還可以定義一個介面類 ,僅定義介面名(函式名) ,由子類繼承去寫介面中的功能
介面類抽象規定了兼容介面 ,是的外部呼叫者不需要關心細節
# 介面類 ,約束子類必須擁有的方法,及引數
class Pay_Base:
def pay(self, money):
raise NotImplementedError('pay must be Implemented')
class ALpay(Pay_Base):
def pay2(self, money):
print('支付寶支付')
class WXpay(Pay_Base):
def pay(self, money):
print('微信支付')
class APpay(Pay_Base):
def pay(self, money):
print('蘋果支付')
# 支付函式,執行物件的介面類約束函式
def pay(payobj, money):
payobj.pay(money)
p1 = ALpay()
pay(p1, 100)
7.反射
反射是通過字串去操作物件或者類或者是模塊 ,第一引數是(物件或者類或者是模塊)
常用:
getter() getattr(引數1 ,'字串') #獲取記憶體地址
hasattr() hasattr(引數1 ,'字串') #判斷變數是否存在
import m1 class A: local = 'Beijing' def __init__(self): pass def datetime1(self): print('time') a1 = A() # 通過反射從物件獲取屬性 b = getattr(a1, 'local') # 通過反射從類中拿屬性 c = getattr(A, 'local') # 通過反射從物件中拿方法 d = getattr(a1, 'datetime1') # 通過反射從模塊中拿到類B B = getattr(m1,'B')
print(hasattr(m1,'B'))
e = B()
8.特殊雙下方法
__str__與__repr__ ,不太理解,但是都可以把物件的記憶體地址轉為可讀字串
__call__方法 ,當物件 + () 的情況就會執行 __call__方法
class A:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def __call__(self, *args, **kwargs):
print(args, kwargs)
return args, kwargs
def __repr__(self):
return '有str就不會執行repr'
a1 = A('lucy')
# 執行物件的__str__方法
print(a1)
# 執行__call__方法
a1(1, 2, 3, n=1, m=2)
# 直接執行物件的__repr__方法
print(repr(a1))
# 查看物件有多少個方法
print(dir(a1))
__new__方法 ,new方法是object基類中的方法 ,是構造方法 ,開辟記憶體 ,創建物件
class A: def __new__(cls, *args, **kwargs): print('1') cls.name = 'LOP' return object.__new__(cls) # 參考obeject的c語言創建物件功能 def __init__(self): print('2') # 第一步執行__new__方法中的內容,將回傳值給物件名a1 # 第二步執行__init__初始化物件 a1 = A() print(a1.name)
a2 = A()
print(a1 is a2) # False 兩個物件各用記憶體
##單例模式##
class A:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
# __instance從此記錄單例物件的記憶體
return cls.__instance
a1 = A()
a2 = A()
print(a1 is a2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/119256.html
標籤:面向對象
下一篇:內部類
