1、面向對象初識
一、結構上 面向對象分紅兩部分:屬性、方法框架
class A: name = 'xiaoming' # 靜態屬性、靜態變量、靜態字段。 def func1(self): # 函數、動態屬性、方法。 pass
二、函數與面向對象:
1,函數封裝一個功能,而面向對象封裝多個相關的功能。
2,面向對象比較抽象,它是一種思想,站在上帝的角度去理解它。
3,面向對象程序可擴展,對象都是一個個獨立的。耦合性,差別性。函數
函數: def register(argv): pass def login(argv): pass def shoppingcar(self): pass 面向對象: class Shopping: def __init__(self): # 特殊方法 pass def register(self): pass def login(self): pass def shoppingcar(self): pass
三、類與對象:
類:具備相同屬性或者功能的一類實物。
對象:對象是類的具體體現。post
2、類名、對象的使用
一、類能夠理解爲:一個公共框架,一個公共模型學習
class person: animal = '高級動物' walk_way = '直立行走' language = '語言' def eat(self): print('當心吃屎你') def play(self): print('每天就知道玩')
二、類名的使用
1,查看類中的全部屬性及方法 __dict__
print(person.__dict__) # 查看類中的全部屬性及方法this
print(person.__dict__['animal']) # 經過__dict__方式能夠查看單獨的屬性及方法,可是不能進行增刪改spa
person.__dict__['animal'] = '低級動物' # 改:報錯指針
person.__dict__['name'] = 'xiaoming' # 增:報錯code
del person.__dict__['animal'] # 刪:報錯對象
工做中,學習中通常用到 __dict__只是用來查看類中的全部屬性及方法,不進行其餘操做。blog
2,查看(增刪改)類中某個屬性用萬能的點 .
print(person.animal) #查 print(person.language) person.name = 'xiaoming' # 增 print(person.name) person.language = '中文' #改 print(person.language) del person.walk_way #刪 print(person.__dict__)
3,操做方法,用類名能夠執行方法,可是通常不經過類名操做!!!
person.__dict__['eat'](111) # 不建議經過__dict__執行方法
person.play(666)
三、對象的使用
class person: animal = '高級動物' walk_way = '直立行走' language = '語言' def __init__(self,name,age,eye): # 功能:給對象封裝屬性的。 self.name1 = name self.age1 = age self.eye1 = eye def eat(self): print('當心吃屎你') def play(self): print('每天就知道玩') obj = person('xiaobai',1000,'小眼睛') # 這個過程是一個實例化過程,他會實例化一個對象(會在內存實例化一個對象空間)。 print(obj) #obj是對象空間的地址 print(obj.name1) # 經過對象查看屬性
實例化過程內部進行了三個階段:
1,首先遇到 類名() 就會在內存中開闢一個對象空間,只有一個類對象指針(用一個變量接收這個對象空間地址)
2,而後自動執行類中的__init__方法,而且將對象空間地址自動傳給self參數,其餘參數手動傳入。
3,最後執行__init__方法 給對象空間封裝相應的屬性。
對象操做對象空間:
1,對象查看對象空間全部的屬性也可用 __dict__
print(obj.__dict__) # 返回一個包含對象空間全部屬性的字典
2,對象操做對象的某個屬性(增刪改查)用萬能的點.
obj.sex = '男' # 增
print(obj.sex)
del obj.eye1 # 刪
print(obj.__dict__)
obj.age1 = 18 # 改
print(obj.age1)
print(obj.name1) #查
print(obj.__dict__) #查
3,對象操做類空間的屬性:只能查
print(obj.animal) #查
obj.animal = '低級動物' # 想要這樣改類的屬性,是改不了的,它會爲對象生成一個animal的屬性並不會改變類的 animal
print(obj.animal) # 低級動物
print(person.animal) # 高級動物
del obj.language # 刪:報錯
4,對象操做類空間的方法:對象.方法()
obj.eat()
3、類名稱空間,對象名稱空間
公用模板,公共框架 class GameRole: rule = '遊戲規則' def __init__(self,area,nickname,hp,ad): self.area = area self.nickname = nickname self.hp = hp self.ad = ad def attack(self): print('攻擊誰') gailun = GameRole('德瑪西亞','草叢倫',1000,75) #實例化對象gailun yasuo = GameRole('艾歐尼亞','託兒所',500,89) #實例化對象yasuo
一張圖片解釋:
1,對象能調用類中的屬性與方法,可是不能修改類的屬性和方法
實例化一個對象的時候,會創建對象指向類的指針,gailun.屬性名,先從本身空間去找,
沒有此屬性它會經過類對象指針從類去找,類中找不到,會從父類去找。
gailun.attack = 666 # 這裏並非調用類的attack方法,而是給對象增長一個屬性 attack = 666 print(gailun.attack) # 666 gailun.rule = gailun.rule # 至關於gailun.rule = '遊戲規則' 對象.屬性名='遊戲規則' print(gailun.rule) gailun.nikename = '蓋倫' #修改對象的屬性 print(gailun.nickname)
2,類能不能調用對象的屬性? 不能,由於類沒有指向對象的指針
print(GameRole.area) # 報錯
3,對象與對象之間可不可互相調用?
同一個類實例化出來的對象之間是不能互相訪問的。
不一樣類實例化的對象有可能互相訪問。
4,給對象封裝屬性:__init__ 任意位置。