目錄python
類即類別、種類,是面向對象設計最重要的概念,對象是特徵與技能的結合體,而類則是一系列對象類似的特徵與技能的結合體。app
那麼問題來了,先有的一個個具體存在的對象(好比一個具體存在的人),仍是先有的人類這個概念,這個問題須要分兩種狀況去看。函數
在現實世界中:先有對象,再有類。設計
世界上確定是先出現各類各樣的實際存在的物體,而後隨着人類文明的發展,人類站在不一樣的角度總結出了不一樣的種類,如人類、動物類、植物類等概念。3d
也就說,對象是具體的存在,而類僅僅只是一個概念,並不真實存在。code
在程序中:務必保證先定義類,後產生對象。對象
這與函數的使用是相似的,先定義函數,後調用函數,類也是同樣的,在程序中須要先定義類,後調用類。blog
不同的是,調用函數會執行函數體代碼返回的是函數體執行的結果,而調用類會產生對象,返回的是對象。繼承
定義類:文檔
類名() 作的事:實例化產生一個空對象,去調用__init__方法,完成對象的初始化
class關鍵字 類名:
pass
class A: pass
產生對象:
對象 = 類名()
class A: pass B=A()
類:
獲取類的屬性和方法:類.__dict__
class A: pass # B=A() print(A.__dict__) #輸出: {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
類來調用屬性和方法:
經過dict來取(複雜,不建議使用)
class A: def __init__(self,name,age): self.name = name self.age = age def change_name(self,new_name): self.name = new_name B = A('ocean',18) print(A.__dict__) print(B.__dict__) print(B.name) A.__dict__['change_name'](B,"haha")#比較麻煩,須要傳入對象 print(B.name) # {'__module__': '__main__', '__init__': <function A.__init__ at 0x000001796354B708>, 'change_name': <function A.change_name at 0x000001796354B798>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None} {'name': 'ocean', 'age': 18} ocean haha
類名.屬性/函數
class A: def __init__(self,name,age): self.name = name self.age = age def change_name(self,new_name): self.name = new_name B = A('ocean',18) A.change_name(B,'haha') print(B.name) print(A.c) # haha 你好
對象:
對象獲取屬性和方法:對象.__dict__
class A: def __init__(self,name,age): self.name = name self.age = age def change_name(self,new_name): self.name = new_name B = A('ocean',18) print(B.__dict__) # {'name': 'ocean', 'age': 18}
對象來調用屬性和方法:對象.屬性/方法
class A: def __init__(self,name,age): self.name = name self.age = age def change_name(self,new_name): self.name = new_name B = A('ocean',18) print(B.name) print(B.age) B.change_name('haha') print(B.name) # ocean 18 haha
對象有:數據屬性(變量),方法屬性(方法)
在對象實例化產生對象的時候,在括號內傳入值,會被傳入到__init__中
方式一:
加入有一個學生類,給他一個名字
stu = Student()
stu.name = 'sb'
class Student: pass stu1 = Student() stu1.name = 'chen' print(stu1.name) # chen
方式二:經過__init__方法
class Student: def __init__(self,name,age): self.name = name self.age = age stu = Student('ocera','18') print(stu.name) stu.name = 'dsb' print(stu.name) # ocera dsb
方式三:
在類中定義該方法,方法上寫一些參數
class Student: def __init__(self,name,age): self.name = name self.age = age def change(self,new_name): self.name = new_name stu = Student('ocera','18') print(stu.name) stu.change('dsb') print(stu.name) # ocera dsb
方式四:用類添加
class Student: pass Student.name = 'st2' stu1 = Student() print(stu1.name) # st2
方式五:用函數
class Student: def __init__(self,name,age): self.name = name self.age = age stu = Student('ocera','18') print(stu.name) def change_name(obj,new_name): obj.name = new_name change_name(stu,'dsb') print(stu.name)
方式六:用類修改
class Student: def __init__(self, name, age): self.name = name self.age = age def study(self): print(self.name) print('study...') def chang_name(obj, new_name): print('原來的名字是%s' % obj.name) obj.name = new_name print('修改的名字是%s' % obj.name) stu = Student('ocera',18) Student.chang_name(stu,'dsb') print(stu.name) # 原來的名字是ocera 修改的名字是dsb dsb
強調__init__(初始化方法)
__init__方法
爲對象初始化本身獨有的特徵
內部幫咱們作了一些事:當我在實例化產生對象的時候,會自動調用__init__方法,完成對象的初始化
強調:
一、該方法內能夠有任意的python代碼
二、必定不能有返回值
三、其餘的方法能夠有返回值
class Student: def __init__(self,name,age): self.name = name self.age =age def study(self): print(self.name) print("study...") def chang_name(self,new_name): print('原來的名字%s'%self.name) self.name = new_name print("如今的名字%s"% self.name) #類來調用對象的綁定方法(寫在類中的函數,沒加裝飾器, # 有幾個參數就須要傳入幾個參數 #Student.__init__(123,'nick',18),因爲沒有對象,會報錯 #類實例化產生對象,會自動調用__init__完成初始化操做 stu = Student('ocera',18) #對象的綁定方法的特殊之處,會把對象自己看成第一個參數傳入 stu.study() # ocera study...
python中類內置的特使屬性
#python爲類內置的特殊屬性 類名.__name__# 類的名字(字符串) 類名.__doc__# 類的文檔字符串 類名.__base__# 類的第一個父類(在講繼承時會講) 類名.__bases__# 類全部父類構成的元組(在講繼承時會講) 類名.__dict__# 類的字典屬性,查找全部的屬性和方法 類名.__module__# 類定義所在的模塊 類名.__class__# 實例對應的類(僅新式類中)
綁定方法,屬性的查找順序
先從對象自身找--->類中找--->報錯
def test(): print('xxx') test.name = 'lqz' print(test.name) # lqz
#一切皆對象 ll=[1,2] #對象來調用 ll.append(5) #類來調用 list.append(ll,5)
# 人狗大戰 class Dog: type_dog = "藏獒" def __init__(self,name,aggressivity,hp = 100): self.aggressivity = aggressivity self.name = name self.hp = hp def bite(self,target): target.hp -= self.aggressivity print( """ 狗的品種:%s 狗名:%s 狗的傷害值:%s 人受到的傷害:%s 人剩餘的血量:%s """%(self.type_dog,self.name,self.aggressivity,self.aggressivity,target.hp) ) class People: def __init__(self,name,aggressivity,hp = 100): self.aggressivity = aggressivity self.name = name self.hp = hp def hit(self,target): target.hp -= self.aggressivity print( """ 人名:%s 人的傷害值:%s 狗受到的傷害:%s 狗剩餘的血量:%s """ % (self.name, self.aggressivity, self.aggressivity, target.hp) ) people1 = People('sb',20) dog1 = Dog('sg',10,200) while people1.hp>0 : people1.hit(dog1) dog1.bite(people1)
print("接下來是對戰小練習,定製英雄,對戰開始") class Revie: def __init__(self, name, arrgressivity=10, life_value=100, money=100, arror=3): self.name = name self.arrgressivity = arrgressivity self.life_value = life_value self.money = money self.arror = arror def atrack(self, enemy): enemy.life_value -= (self.arrgressivity - enemy.arror) class Gewen: def __init__(self, name, arrgressivity=10, life_value=100, money=100, arror=3): self.name = name self.arrgressivity = arrgressivity self.life_value = life_value self.money = money self.arror = arror def atrack(self, enemy): enemy.life_value -= (self.arrgressivity - enemy.arror) class Weapon: def __init__(self, price=10, life_value=100, arror=10, arrgv=100): self.price = price self.arror = arror self.life_value = life_value self.arrgv = arrgv def update(self, obj): obj.money -= self.price obj.life_value += self.life_value obj.arrgressivity += self.arrgv obj.arror+=self.arror def fire(self, obj): obj.life_value -= 50 p1 = Revie('潤文') p2 = Gewen("蓋文") arm = Weapon() if p1.money > arm.price: p1.arm = arm arm.update(p1) print(p1.money,p1.life_value,p1.arrgressivity,p1.arror) print(p2.money,p2.life_value,p2.arrgressivity,p2.arror) while p1.life_value>0 and p2.life_value>0: p1.atrack(p2) print(""" 姓名:%s 餘額:%s 生命值:%s 攻擊力:%s 護甲:%s """%(p2.name,p2.money, p2.life_value, p2.arrgressivity, p2.arror)) p2.atrack(p1) print(""" 姓名:%s 餘額:%s 生命值:%s 攻擊力:%s 護甲:%s """ % (p1.name, p1.money, p1.life_value, p1.arrgressivity, p1.arror)) p1.arm.fire(p2) print(""" 姓名:%s 餘額:%s 生命值:%s 攻擊力:%s 護甲:%s """ % (p2.name, p2.money, p2.life_value, p2.arrgressivity, p2.arror)) p2.atrack(p1) print(""" 姓名:%s 餘額:%s 生命值:%s 攻擊力:%s 護甲:%s """ % (p1.name, p1.money, p1.life_value, p1.arrgressivity, p1.arror))