溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python自動(dòng)化運(yùn)維開(kāi)發(fā)----基礎(chǔ)(十五)Python面向?qū)ο?/h1>
發(fā)布時(shí)間:2020-06-04 00:46:40 來(lái)源:網(wǎng)絡(luò) 閱讀:366 作者:Demon寬 欄目:編程語(yǔ)言

1.面向過(guò)程和面向?qū)ο蟮膮^(qū)別

面向過(guò)程 : 需要用什么代碼去解決什么問(wèn)題

面向?qū)ο?: 我有什么可以給你什么

2.面向?qū)ο蟮奶卣?/p>

(1)封裝

數(shù)據(jù)不想讓別人接觸到的 

函數(shù)(過(guò)程) =》 方法(在面向?qū)ο笾校禾峁┖瘮?shù)、方法對(duì)數(shù)據(jù)進(jìn)行訪問(wèn)和操作

(2)繼承

有一塊代碼塊 A(函數(shù))

B 也想有一個(gè)代碼塊(函數(shù))

(3)多態(tài)

一個(gè)對(duì)象可以體現(xiàn)不同的特征

3. 實(shí)驗(yàn)

創(chuàng)建一個(gè)類(lèi)

>>> class Person(object):
...     pass
...

創(chuàng)建一個(gè)實(shí)例對(duì)象

>>> kk = Person() 
>>> type(kk)
<class '__main__.Person'>

創(chuàng)建實(shí)例對(duì)象的屬性

>>> 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']

定義類(lèi)的屬性

>>> class person(object):
...     name = 'kk'
... 
>>> kk = person()
>>> kk.name
'kk'

類(lèi)、實(shí)例對(duì)象查找屬性也是有順序的:先在實(shí)例對(duì)象中找,如果實(shí)例對(duì)象中沒(méi),接著去類(lèi)中屬性找,如果類(lèi)中屬性沒(méi)的話就報(bào)錯(cuò)了

小案例: 更好的區(qū)分類(lèi)的屬性和實(shí)例對(duì)象的屬性

創(chuàng)建一個(gè)類(lèi)

>>> class Person(object):
...     name = 'kk'
...

創(chuàng)建實(shí)例對(duì)象name1 并給實(shí)例對(duì)象添加 addr 屬性

>>> name1 = Person()
>>> name1.addr = '西安市'

創(chuàng)建實(shí)例對(duì)象name2 并給實(shí)例對(duì)象添加 age 屬性

>>> name2 = Person()
>>> name2.age = 25

測(cè)試訪問(wèn)name1 的age 屬性 是報(bào)錯(cuò)的 因?yàn)?實(shí)例對(duì)象name1和類(lèi)中都沒(méi)有age屬性

>>> name1.age
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'

分別打印類(lèi)、實(shí)例對(duì)象name1、實(shí)例對(duì)象name2的name屬性

>>> print(person.name,name1.name,name2.name)
kk kk kk

給實(shí)例對(duì)象name1重新設(shè)置一下name 屬性,在依次打印name屬性

>>> print(person.name,name1.name,name2.name)
kk kk1 kk

案例總結(jié):

(1)類(lèi)的屬性和實(shí)例的屬性可以動(dòng)態(tài)賦值

(2)在訪問(wèn)實(shí)例對(duì)象的屬性時(shí),優(yōu)先訪問(wèn)實(shí)例對(duì)象的屬性;當(dāng)實(shí)例對(duì)象的屬性不存在的時(shí)候,去訪問(wèn)類(lèi)的屬性,類(lèi)的屬性不存在就報(bào)錯(cuò)

(3)實(shí)例對(duì)象設(shè)置和修改屬性的時(shí)候,不會(huì)影響類(lèi)的屬性

4.類(lèi)

初始化函數(shù)(構(gòu)造函數(shù))

以下類(lèi)中的初始化函數(shù)

>>> class person(object):
...     def __init__(self):
...         self.name = 'kk'
...         self.age = 24
...

創(chuàng)建一個(gè)實(shí)例對(duì)象

>>> name1 = person()
>>> name1.name
'kk'
>>> name1.age
24

重新創(chuàng)建一個(gè)類(lèi)

>>> class person(object):   
...     name = 'Dog'
...     def __init__(self):
...         self.name = 'dog'
...

分別打印類(lèi)和實(shí)例對(duì)象的name屬性

>>> name1 = person()
>>> print(name1.name, person.name)
dog Dog

類(lèi)的方法,如下創(chuàng)建類(lèi)的方法

>>> class Test(object):
...     Name = 'Test'
...     @classmethod
...     def class_method(cls):
...         print(cls.Name)
...

訪問(wèn)類(lèi)的方法

>>> Test.class_method()
Test

創(chuàng)建實(shí)例對(duì)象test ,實(shí)例對(duì)象訪問(wèn)類(lèi)的方法

>>> test = Test()
>>> test.class_method()
Test

實(shí)例的方法

>>> class Test(object):
...     Name = 'Test'
...     def __init__(self):
...         self.name = 'test'
...     def instance_method(self):
...         print(self.name)
...         print(self.Name)
..

訪問(wèn)實(shí)例的方法

>>> t = Test()
>>> t.instance_method()
test
Test

靜態(tài)方法 (@staticmethod)

>>> class Test(object):
...     @staticmethod
...     def static_method():
...         print('static_method')
... 
>>> Test.static_method()
static_method

小案例 

貓狗大戰(zhàn),貓的初始生命值是120 , 狗的初始生命值是100,random隨機(jī)掉血,采用繼承的方式

#!/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,'對(duì)手剩余:',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

執(zhí)行結(jié)果:

Python自動(dòng)化運(yùn)維開(kāi)發(fā)----基礎(chǔ)(十五)Python面向?qū)ο?></p><p>重寫(xiě)父類(lèi)的***方法,讓狗***貓時(shí)掉血范圍在10-30</p><pre class=class Dog(Animals):     def attack(self,rival):         drop = random.randint(10,30)         rival.drop_blood(drop)         print(self.name,'讓',rival.name,'掉血',drop,'對(duì)手剩余:',rival.get_blood(),'血')

Python自動(dòng)化運(yùn)維開(kāi)發(fā)----基礎(chǔ)(十五)Python面向?qū)ο?></p><p>重寫(xiě)父類(lèi)的方法,當(dāng)貓受到的***大于20 的時(shí)候自動(dòng)補(bǔ)血 8</p><pre class=class Cat(Animals):     def drop_blood(self,drop):         super(Cat,self).drop_blood(drop)         if drop > 20 :             print('我掉了',drop,'滴血,觸發(fā)自動(dòng)補(bǔ)血技能')             self.blood += 8

5.實(shí)例的私有屬性

定義一個(gè)類(lèi)

>>> class Person(object):
...     def __init__(self,name,age):
...         self.__name = name
...         self.__age = age
...

創(chuàng)建一個(gè)實(shí)例,并嘗試訪問(wèn)實(shí)例的屬性,會(huì)報(bào)錯(cuò)

>>> kk = Person('kk',30)
>>> kk.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'name'

私有屬性的訪問(wèn)

>>> kk._Person__age
30

@property 和 @方法名.setter的使用

@property 把一個(gè)方法變成屬性去調(diào)用 

@方法名.setter是把一個(gè)方法變成屬性賦值

>>> 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
...

訪問(wèn)測(cè)試

>>> kk = Person('kk',20)
>>> kk.name
'kk'
>>> kk.name = 'kk1'
>>> kk.name
'kk1'


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI