【16】有關python面向對象編程

面向對象編程

1、第一個案例---建立類

#__author:"吉"
#date: 2018/10/27 0027
#function:

# 設計類:
'''
1 類名:首字母大寫,見名思意
2 屬性:駝峯原則
3 行爲:見名思意,駝峯法
說明:類不佔空間,實例化對象佔用空間!
'''

# 格式,object是父類,超類
'''
類名(object):
    屬性
    行爲
'''
class Peoson(object):
    name = 'zhanglei'
    age = 24
    weight = 70

    def run(self):
        print("跑!")
    def eat(self):
        print('')

2、使用類實例化對象

#__author:"吉"
#date: 2018/10/27 0027
#function:


# 設計類:
'''
1 類名:首字母大寫,見名思意
2 屬性:駝峯原則
3 行爲:見名思意,駝峯法
說明:類不佔空間,實例化對象佔用空間!
'''

# 格式,object是父類,超類
'''
類名(object):
    屬性
    行爲
'''


class Peoson(object):
    name = 'zhanglei'
    age = 24
    weight = 70

    def run(self):
        print("跑!")

    def eat(self):
        print('')

    def changeName(self,name):
        self.name = name


# 實例化對象
'''
格式:對象名= 類名(參數列表信息)
'''
peoson1 = Peoson()
print(peoson1.name,peoson1.age,peoson1.weight)
print(peoson1.eat())
print(peoson1.run())

# 原理
'''
變量是在棧區,對象是在堆區。

'''

3、訪問對象的屬性和方法

#__author:"吉"
#date: 2018/10/27 0027
#function:

# 設計類:
'''
1 類名:首字母大寫,見名思意
2 屬性:駝峯原則
3 行爲:見名思意,駝峯法
說明:類不佔空間,實例化對象佔用空間!
'''

# 格式,object是父類,超類
'''
類名(object):
    屬性
    行爲
'''


class Peoson(object):
    name = 'zhanglei'
    age = 24
    weight = 70

    def run(self):
        print("跑!")

    def eat(self):
        print('')

    def changeName(self,name):
        self.name = name


# 實例化對象
'''
格式:對象名= 類名(參數列表信息)
'''
peoson1 = Peoson()

# 訪問屬性
'''
變量是在棧區,對象是在堆區。

'''
print(peoson1.name,peoson1.age,peoson1.weight)
peoson1.name = 'jiji'
peoson1.age = 33
peoson1.weight = 90

print(peoson1.name,peoson1.age,peoson1.weight)

peoson1.changeName('lala')

print(peoson1.name,peoson1.age,peoson1.weight)

4、構造函數

#__author:"吉勇佳"
#date: 2018/10/27 0027
#function:

'''
構造函數:__init__() 是在建立類的時候自動調用,不寫出這個
        構造函數的話,默認是一個空的構造函數什麼頁不執行。

'''

class Peoson(object):
    def __init__(self,name,age,height,weight):
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight

    def run(self):
        print("跑!")

    def eat(self):
        print('')

    def changeName(self,name):
        self.name = name

# 實例化對象
p1 = Peoson("jiyongjia",24,177,78)

print(p1.name,p1.age,p1.height,p1.weight)
p1.changeName('zhanglei')
print(p1.name,p1.age,p1.height,p1.weight)

# self 原理
'''
一、哪一個對象調用,self就表明那個對象。 
'''

5、self.__class__()的使用建立實例與析構函數

class Peoson(object):
    def __init__(self,name,age,height,weight):
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    # 這裏是析構函數
    def __del__(self):
        print("我是析構函數")


    def run(self):
        print("跑!")

    def eat(self):
        print('')

    def changeName(self,name):
        self.name = name

    # 建立對象函數  self.__class__ 是表明類名的
    def createObj(self,name):
        p=self.__class__(name,24,56,89)
        print(p.name,p.age,p.weight,p.height)


# 即 執行p1的一個方法便可建立新的對象。
p1 = Peoson("麗麗",33,53,222)
print(p1.name,p1.age,p1.height,p1.weight)
p1.createObj("狗熊")

'''
輸出:麗麗 33 53 222
狗熊 24 89 56
我是析構函數
我是析構函數
'''
print(p1.name)

6、__str__()與__repr__()比較

'''
重寫
__str__()
    str方法是給用戶用的,用於返回用戶須要的結果信息、
__repr__()
   若是換成__repr__()是獲得與str相同的結果。是在黑屏終端直接敲對象名再回車的方法
    注意:在沒有str方法可是有repr的時候,repr 就至關於str,只是repr用於黑屏終端
'''

class Peoson(object):
    def __init__(self,name,age,height,weight):
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    # 這裏是析構函數
    def __del__(self):
        print("我是析構函數")


    def run(self):
        print("跑!")

    def eat(self):
        print('')

    def changeName(self,name):
        self.name = name

    # 建立對象函數  self.__class__ 是表明類名的
    def createObj(self,name):
        p=self.__class__(name,24,56,89)
        print(p.name,p.age,p.weight,p.height)

    # 若是換成__repr__()是獲得相同的結果。是在黑屏終端直接敲對象名再回車的方法
    def __str__(self):
        pass
        # return "這裏是str"
        # return self.name
        #返回多個值的話用以下
        return "%s-%d-%d" % (self.name,self.age,self.weight)



# 若是要打印出全部的屬性信息呢?
p1 = Peoson("嘉嘉",44,222,336)

# 不寫def __str__()方法的時候,打印出的是該對象的地址信息
print(p1)
'''
輸出:<__main__.Peoson object at 0x0000000002564978>
'''

# 寫了__str__()函數是 打印出的本身須要返回的信息數據,此時p1等價於p1.__str__()
print(p1)

7、練習-面向對象做業:

槍設計子彈 設計一次少一個子彈,沒子彈了提示沒法射擊

#__author:"吉"
#date: 2018/10/27 0027
#function:

# 槍設計子彈 設計一次少一個子彈,沒子彈了提示沒法射擊

class Gun(object):
    def __init__(self,name,bulletNum):
        self.name = name
        self.bulletNum = bulletNum

    def shot(self):
        self.bulletNum =self.bulletNum - 1
        if self.bulletNum+1 != 0:
            print("此槍型號是:%s,這次射擊成功!子彈減小1發,餘量爲:%d" %(self.name,self.bulletNum))
        else:
            print("*************射擊失敗,子彈數爲0.已經爲您子彈加彈5發!請從新射擊!**************")
            self.bulletNum = 5

gun = Gun("AK47",5)
# 射擊敵人
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()
gun.shot()

'''
輸出:
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:4
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:3
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:2
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:1
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:0
*************射擊失敗,子彈數爲0.已經爲您子彈加彈5發!請從新射擊!**************
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:4
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:3
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:2
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:1
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:0
*************射擊失敗,子彈數爲0.已經爲您子彈加彈5發!請從新射擊!**************
此槍型號是:AK47,這次射擊成功!子彈減小1發,餘量爲:4

'''

 8、如何建立私有屬性,在外部沒法被訪問或者修改

#1 指定私有屬性,在外部沒法更改:即在屬性前加兩個下劃線 如__money
#2 在python中只有某屬性前邊有兩個下劃線的才叫 私有屬性,而__money__這種不叫,這是特殊屬性。
#3 _money 也不是私有屬性,可是當咱們看到這樣的變量時,咱們應該約定俗成的把它看作私有的。本質不是私有,是能夠訪問的。
# 指定私有屬性,在外部沒法更改:即在屬性前加兩個下劃線 如__money

class Person(object):
    def __init__(self,name,age,height,weight,money):
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
        self.__money= money

    def run(self):
        print("跑!")

    def eat(self):
        print('')

    def changeName(self,name):
        self.name = name

    # 建立對象函數  self.__class__ 是表明類名的
    def createObj(self,name):
        p=self.__class__(name,24,56,89,10000)
        print(p.name,p.age,p.weight,p.height,p.__money)


# 即 執行p1的一個方法便可建立新的對象。
p1 = Person("麗麗",33,53,222,20000)

print(p1.name,p1.__money)    #此處出錯,在外部沒法訪問私有

若是想在外邊訪問的話,能夠把私有的屬性放在方法裏面,調用方法,便可訪問私有屬性。如:python

def run(self):
print("跑!")
print("工資",self.__money)
總結:訪問或者修改私有屬性的時候能夠經過固定的兩個方法來達到修改和訪問,同時,方法中能夠對數據進行過濾。
    # 對於處理私有屬性的方法---設置值的方法
    def SetMoney(self,money):
        if money<0:
            print("輸入的錢不能小於0")
        else:
            self.__money = money

    # 對於訪問私有屬性的方法
    def GetMoney(self):
        return self.__money
# 其實,不能訪問__money的緣由是由於 python把私有的屬性改變爲了 _Person__money ,
# 即仍然是能夠訪問的。可是應該遵循規則,不這麼訪問,
p1._Person__money = 70
print(p1.GetMoney())

上述是依然還能夠把私有屬性進行修改。
父類的文件信息:
class People(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age


子類中調用上邊的父類
from people import People

class Student(People):
def __init__(self,name,age,faceValue):
# 繼承父類的__init__()
super(Student,self).__init__(name,age)
self.faceValue = faceValue
stu = Student("玲",22,100)
print(stu.name,stu.age,stu.faceValue)

輸出

   玲 22 100編程



# 總結:
# 咱們發現Student類中並沒有這兩個屬性信息,這兩個屬性是調用的父類的__init__中的屬性。
# 總結: # 咱們發現Student類中並沒有這兩個屬性信息,這兩個屬性是調用的父類的__init__中的屬性。
相關文章
相關標籤/搜索