1. 程式人生 > 實用技巧 >python基礎-面向物件(一)概念的引入

python基礎-面向物件(一)概念的引入

先看需求:如何描述一條狗?一種是這條狗的獨有特徵(如名字,性別,類別),還有所有狗都有的行為(吃喝拉撒睡),如何實現呢,獨有特徵肯定用dict,行為當然是用函式來完成。

dog1={
    'name':'旺財',
    'gender':'',
    'type':'藏獒'
}
person1={
    'name':'alex',
    'gender':'',
    'type':''
}
def eat(dog):
    print('%s在吃屎'%dog['name'])
def jiao(dog):
    print('%s 在叫'%dog['name'])

jiao(dog1)

但是會有一個問題,人person1,他也可以呼叫狗的def eat(),def jiao()。如何避免這個問題呢?難道每次呼叫函式都用 if 判斷?

其實根據函式的作用域,可以把函式放到一個大的函式裡邊,做成子函式,那麼外部的人就呼叫不到了

person1 = {
    'name': 'alex',
    'gender': '',
    'type': ''
}


def dog():
    def eat(dog):
        print('%s在吃屎' % dog['name'])

    def jiao(dog):
        print('%s 在叫
' % dog['name']) dog1 = { 'name': '旺財', 'gender': '', 'type': '藏獒', 'eat': eat, 'jiao': jiao } return dog1 dog()['jiao'](dog()) dog()['eat'](dog())

現在還有個問題,就是狗被寫死了,名字,性別,類別等都被寫死了!如何不寫死,當然是根據使用者的引數傳入來寫。

person1 = {
    'name': 'alex',
    '
gender': '', 'type': '' } def dog(name, gender, type): def eat(dog): # 需要字典dog print('%s在吃屎' % dog['name']) def jiao(dog): # 需要字典dog print('%s 在叫' % dog['name']) dog1 = { 'name': name, 'gender': gender, 'type': type, 'eat': eat, 'jiao': jiao } return dog1 d1 = dog('旺財', '', '藏獒') d1['eat'](d1) # 注意,需要的引數是dict,傳的引數是自己,返回的就是dog1的dict。

一般獨有的特徵會放到一個init初始化函式裡面

程式碼就被優化成這樣

person1 = {
    'name': 'alex',
    'gender': '',
    'type': ''
}


def dog(name, gender, type):
    def eat(dog):  # 需要字典dog
        print('%s在吃屎' % dog['name'])

    def jiao(dog):  # 需要字典dog
        print('%s 在叫' % dog['name'])

    def init(name,gender,type):
        dog1 = {
            'name': name,
            'gender': gender,
            'type': type,
            'eat': eat,
            'jiao': jiao
        }
        return dog1
    return init(name,gender,type)


d1 = dog('旺財', '', '藏獒')
d1['eat'](d1)  # 注意,需要的引數是dict,傳的引數是自己,返回的就是dog1的dict。

從上面可以看出來:

1.類:是具有相同屬性的一類實物的集合。

2.物件:物件是類當中具體的某個物體。

再來一個需求:如何描述一個學校?特徵(名字,地址,私立還是公立),動作(招生,考試),根據上面的例子程式碼應該可以一步到位了。

def school(name,addrs,type):
    def init(name,addrs,type):
        school1={
            'name':name,
            'addrs':addrs,
            'type':type,
            'zhaosheng':zhaosheng,
            'kaoshi':kaoshi
        }
        return school1
    def zhaosheng(school):
        print('%s學校正在招生'%school['name'])
    def kaoshi(school):
        print('%s學校正在考試'%school['name'])
    return init(name,addrs,type)

school1=school('北大','北京','私立')['kaoshi'](school('北大','北京','私立')) #傳的是自己self

上面用函式def完成了一個類,說明

面向物件設計:是將一類具體實物的資料和動作整合到一起。不一定非得用Class,用函式def也可以實現

面向物件程式設計:用Class+例項/物件的方法去實現面向物件設計。如C++有很多class