1.面向過程和麪向對象的區別
python
面向過程 : 須要用什麼代碼去解決什麼問題dom
面向對象 : 我有什麼能夠給你什麼ssh
2.面向對象的特徵ide
(1)封裝函數
數據不想讓別人接觸到的 測試
函數(過程) =》 方法(在面向對象中):提供函數、方法對數據進行訪問和操做orm
(2)繼承對象
有一塊代碼塊 A(函數)blog
B 也想有一個代碼塊(函數)繼承
(3)多態
一個對象能夠體現不一樣的特徵
3. 實驗
建立一個類
>>> class Person(object): ... pass ...
建立一個實例對象
>>> kk = Person() >>> type(kk) <class '__main__.Person'>
建立實例對象的屬性
>>> kk.name = 'kk' >>> dir(kk) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',\ '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'\ , 'name']
定義類的屬性
>>> class person(object): ... name = 'kk' ... >>> kk = person() >>> kk.name 'kk'
類、實例對象查找屬性也是有順序的:先在實例對象中找,若是實例對象中沒,接着去類中屬性找,若是類中屬性沒的話就報錯了
小案例: 更好的區分類的屬性和實例對象的屬性
建立一個類
>>> class Person(object): ... name = 'kk' ...
建立實例對象name1 並給實例對象添加 addr 屬性
>>> name1 = Person() >>> name1.addr = '西安市'
建立實例對象name2 並給實例對象添加 age 屬性
>>> name2 = Person() >>> name2.age = 25
測試訪問name1 的age 屬性 是報錯的 由於 實例對象name1和類中都沒有age屬性
>>> name1.age Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute 'age'
分別打印類、實例對象name一、實例對象name2的name屬性
>>> print(person.name,name1.name,name2.name) kk kk kk
給實例對象name1從新設置一下name 屬性,在依次打印name屬性
>>> print(person.name,name1.name,name2.name) kk kk1 kk
案例總結:
(1)類的屬性和實例的屬性能夠動態賦值
(2)在訪問實例對象的屬性時,優先訪問實例對象的屬性;當實例對象的屬性不存在的時候,去訪問類的屬性,類的屬性不存在就報錯
(3)實例對象設置和修改屬性的時候,不會影響類的屬性
4.類
初始化函數(構造函數)
如下類中的初始化函數
>>> class person(object): ... def __init__(self): ... self.name = 'kk' ... self.age = 24 ...
建立一個實例對象
>>> name1 = person() >>> name1.name 'kk' >>> name1.age 24
從新建立一個類
>>> class person(object): ... name = 'Dog' ... def __init__(self): ... self.name = 'dog' ...
分別打印類和實例對象的name屬性
>>> name1 = person() >>> print(name1.name, person.name) dog Dog
類的方法,以下建立類的方法
>>> class Test(object): ... Name = 'Test' ... @classmethod ... def class_method(cls): ... print(cls.Name) ...
訪問類的方法
>>> Test.class_method() Test
建立實例對象test ,實例對象訪問類的方法
>>> test = Test() >>> test.class_method() Test
實例的方法
>>> class Test(object): ... Name = 'Test' ... def __init__(self): ... self.name = 'test' ... def instance_method(self): ... print(self.name) ... print(self.Name) ..
訪問實例的方法
>>> t = Test() >>> t.instance_method() test Test
靜態方法 (@staticmethod)
>>> class Test(object): ... @staticmethod ... def static_method(): ... print('static_method') ... >>> Test.static_method() static_method
小案例
貓狗大戰,貓的初始生命值是120 , 狗的初始生命值是100,random隨機掉血,採用繼承的方式
#!/usr/bin/python import random class Animals(object): def __init__(self,name,blood=100): self.name = name self.blood = blood def get_name(self): return self.name def get_blood(self): return self.blood def drop_blood(self,blood): self.blood -= blood def attack(self,rival): drop = random.randint(0,20) rival.drop_blood(drop) print(self.name,'讓',rival.name,'掉血',drop,'對手剩餘:',rival.get_blood(),'血') class Dog(Animals): pass class Cat(Animals): pass if __name__ == '__main__': dog = Dog('wangwang') cat = Cat('miaomiao',120) while True: dog.attack(cat) if cat.get_blood() < 0: print('勝利方是:',dog.get_name()) break cat.attack(dog) if dog.get_blood() < 0: print('勝利方是:',cat.get_name()) break
執行結果:
重寫父類的***方法,讓狗***貓時掉血範圍在10-30
class Dog(Animals): def attack(self,rival): drop = random.randint(10,30) rival.drop_blood(drop) print(self.name,'讓',rival.name,'掉血',drop,'對手剩餘:',rival.get_blood(),'血')
重寫父類的方法,當貓受到的***大於20 的時候自動補血 8
class Cat(Animals): def drop_blood(self,drop): super(Cat,self).drop_blood(drop) if drop > 20 : print('我掉了',drop,'滴血,觸發自動補血技能') self.blood += 8
5.實例的私有屬性
定義一個類
>>> class Person(object): ... def __init__(self,name,age): ... self.__name = name ... self.__age = age ...
建立一個實例,並嘗試訪問實例的屬性,會報錯
>>> kk = Person('kk',30) >>> kk.name Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute 'name'
私有屬性的訪問
>>> kk._Person__age 30
@property 和 @方法名.setter的使用
@property 把一個方法變成屬性去調用
@方法名.setter是把一個方法變成屬性賦值
>>> class Person(object): ... def __init__(self,name,age): ... self._name = name ... self._age = age ... @property ... def name(self): ... return self._name ... @name.setter ... def name(self,value): ... self._name = value ...
訪問測試
>>> kk = Person('kk',20) >>> kk.name 'kk' >>> kk.name = 'kk1' >>> kk.name 'kk1'