1. 程式人生 > >day07面向對象進階

day07面向對象進階

all 經典 bstr 系列 pri def import mon delattr

類.__init__查看對象的函數屬性

類.__dict__查看類的屬性對象

定義在類內部的變量,是所有對象共有的,id相同

定義在類內部的函數,是綁定在所有對象上,給對象用的obj.func()就會吧obj傳到func(obj)

類內部的方法都是綁定方法,綁定到對象上

綁定方法(類綁定,對象綁定),非綁定方法

面向對象的特性

類與對象

對象是特征(變量)與技能(函數)的結合

類是一系列對象共有的特征和技能

現實中,先有對象,再總結歸納出類,程序中,先定義類再實例化對象

類的第一種用法,實例化

第二種用法,屬性引用

繼承與多態

繼承

“是”的關系,可以用繼承來消除代碼冗余

人是動物,豬是動物,狗是動物

類的括號寫的是被繼承的類

繼承順序,在python2中有經典類和新式類,python3中只有新式類,新式類繼承順序

新式類繼承順序:D->C->B->E->F->G->A

繼承可以是變量可以是方法,對象本身沒有的變量或者方法去父類中找,父類沒有去object中找。

組合

也可以解決代碼容易,是什麽“有”什麽的關系

class teacher:
def __init__(self,name,age,year,mon,day):
self.name = name
self.age = age
self.birth1 = birth(year,mon,day)

class

birth:
def __init__(self,year,mon,day):
self.year = year
self.mon = mon
self.day = day

def tell(self):
print("%s-%s-%s" %(self.year,self.mon,self.day))
t=teacher("dodo",18,1990,8,12)
print(t)#<__main__.teacher object at 0x00000000006C1DA0>
print(t.name)#dodo
print(t.birth1)#<__main__.birth object at 0x00000000006C1DD8>
t.birth1.tell()#1990-8-12

模擬接口

在類裏面定義需要實現的功能,在實例中實現

class File():

# def read(self):#pass

# #方法一:主動拋異常,讓實例實現read功能

# raise TypeError("類型錯誤")#主動拋異常,只有子類重寫才不會拋異常

# #方法二:強行實現功能,抽象類

抽象類

import abc
class File(metaclass = abc.ABCMeta):
@abc.abstractmethod
def read(self): pass
@abc.abstractmethod
def talk(self):pass
class
word(File):
def read(self):
print("read")
def talk(self):
print("talk")

p=word()#

多態

同一種事物的多種形態,類的子類。

多態性:具有不同功能的函數可以使用相同的函數名

如:父類的函數,在子類重寫

封裝

綁定方法和非綁定方法

綁定方法:可以自動傳值

只要在類內部定義,沒有任何修飾,就是對象的綁定方法,把對象當做第一個參數傳入方法

[email protected],把類當做第一個參數傳入方法體

非綁定方法

[email protected],就是一個普通工具

"""
綁定方法和非綁定方法
"""
class Foo:
def test1(self):
pass
@classmethod
def test2(cls):
pass
@staticmethod
def test3():
pass

p = Foo()
print(p.test1)
print(Foo.test2)
print(p.test3)
"""
<bound method Foo.test1 of <__main__.Foo object at 0x0000000000AB1D30>>
<bound method Foo.test2 of <class ‘__main__.Foo‘>>
<function Foo.test3 at 0x0000000000AB3598>
"""

反射

通過字符串的方式尋找類中的屬性

class people:
country = ‘chinese‘
def __init__(self,name,age):
self.name = name
self.age = age
p = people("egon",10)

查詢

# print(hasattr(p,‘name‘))#類中有沒有name屬性

增加
# setattr(p,‘x‘,123)#設置屬性值
# print(p.__dict__)#{‘x‘: 123, ‘age‘: 10, ‘name‘: ‘egon‘}

獲取
# print(getattr(p,‘name‘))#egon
# print(getattr(p,‘x‘,"not exist"))#not exist
# #
或者
# if hasattr(p,‘x‘):
# res = getattr(p,‘x‘)
# print(res)
刪除
print(people.__dict__)#country
print(p.country)
delattr(people,‘country‘)
print(people.__dict__)#country

day07面向對象進階