• Python之路【第九篇】:Python面向对象


    阅读目录

    一、三大编程范式

    编程范式即编程的方法论,标识一种编程风格:

    大家学习了基本的python语法后,大家可以写python代码了,然后每个人写代码的风格不同,这些不同的风格就代表了不同的流派;

    如果把python的基本语法比作武术的基本功,那么不同的编程风格就好比不同的武林门派。

    虽然大家风格不同,但是都可以完成你的编程需求,python是一门面向对象编程语言,但是目前为止,你从未接触面向对象编程,然而你已经可以解决很多问题了,在python中并没有人强制你使用哪一种固定的风格。

    三大编程范式:

    1、面向过程编程:

    2、函数式编程:

    3、面向对象编程:

     

    二、编程进化论

    1、编程最开始就是无组织无结构,从简单控制流中按步写指令

    2、从上述的指令中提取重复的代码块或逻辑,组织到一起(比如说,你定义一个函数),便实现了代码重用,且代码由无结构走向结构化,创建程序的过程变得更具逻辑性

    3、我们定义函数都是独立于函数外定义变量,然后作为参数传递给函数,这意味着:数据与动作是分离的

    4、如果我们把数据和动作内嵌到一个结构(函数或类)里面,那么我们就有了一个‘对象系统’(对象就是数据与函数整合到一起的产物)。

    #狗的特征
    dog1={
        'name':'朱锐',
        'gender':'公',
        'type':'藏獒'
    }
    
    dog2={
        'name':'simon',
        'gender':'母',
        'type':'吉娃娃'
    }
    
    person1={
        'name':'william',
        'gender':'母',
        'type':'人'
    }
    
    
    def dog(name,gender,type):
        # 狗的动作
        def jiao(dog):
            print('一条狗[%s], 汪汪汪' %dog['name'])
        def chi_shi(dog):
            print('一条狗[%s] 正在拉屎' %dog['type'])
        def init(name,gender,type):
            dog1 = {
                'name':name,
                'gender':gender,
                'type':type,
                'jiao':jiao,
                'chi_shi':chi_shi,
            }
            return dog1
        return init(name,gender,type)
    
    d1=dog('simon','母','吉娃娃')
    d2=dog('william','母','藏獒')
    print(d1)
    print(d2)
    d1['jiao'](d1)
    d2['chi_shi'](d2)

    输出结果:

    C:Python35python3.exe G:/python_s3/chapter24-面向对象/面向对象.py
    {'jiao': <function dog.<locals>.jiao at 0x0000000000B3E0D0>, 'gender': '母', 'chi_shi': <function dog.<locals>.chi_shi at 0x0000000000B3E1E0>, 'type': '吉娃娃', 'name': 'simon'}
    {'jiao': <function dog.<locals>.jiao at 0x0000000000B3E2F0>, 'gender': '母', 'chi_shi': <function dog.<locals>.chi_shi at 0x0000000000B3E378>, 'type': '藏獒', 'name': 'william'}
    一条狗[simon], 汪汪汪
    一条狗[藏獒] 正在拉屎
    类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念;
    
    对象:就是基于类而创建的一个具体的事物 (具体存在的),也是特征和动作整合到一起;

    三、面向对象设计与面向对象编程

    3.1 面向对象设计(Object oriented design):将一类具体事物的数据和动作整合到一起,即面向对象设计

    面向对象设计(OOD)不会特别要求面向对象编程语言。事实上,OOD可以由纯结构化语言来实现(比如C)。但如果想要构造具备对象性质和特点的数据类型,就需要在程序上做更多的努力。

    我们现在想用程序表述一台提款机,可以用面向过程,和面向对象两种方式设计。

    3.2 面向对象编程(Object-oriented programming):用定义类+实例/对象的方式去实现面向对象的设计

    #用面向对象编程独有的语法class去实现面向对象设计
    class Dog:
        def __init__(self,name,gender,type):
            self.name=name
            self.gender=gender
            self.type=type
    
        def bark(self):
            print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type))
    
        def yao_ren(self):
            print('[%s]正在咬人' %(self.name))
    
        def chi_shi(self):
            print('[%s]正在吃屎' %(self.type))
    
    
    dog1=Dog('alex','female','京巴')
    print(dog1.__dict__)
    # dog2=Dog('wupeiqi','female','腊肠')
    # dog3=Dog('yuanhao','female','藏獒')
    #
    # dog1.bark()
    # dog2.yao_ren()
    # dog3.chi_shi()

    四、小结

    一门面向对象的语言不一定会强制你写OO方面的程序。例如C++可以被认为"更好"的“C”;而JAVA,则是万物皆类,此外还规定,一个源文件对应一个类定义。

    然而,在python中,类和OOP都不是日常编程所必需的。尽管它从一开始设计就是面向对象的,并且结构上支持OOP,但Python没有限定或要求你在你的应用中写OO的代码

    用面向对象语言写程序,和一个程序的设计是面向对象的,两者是八竿子打不着的两码事。

    纯C写的Linux Kernel事实上比C++/java 之类语言搞出来的大多数项目更加面向对象-----只是绝大部分人都自以为自己到处瞎写的class的苗条代码才是面向对象的正统、而死脑筋linus搞得泛文件抽象不过是过程是思维搞出来的老古董。

    五、类和对象

    1、什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例)。

    2、什么叫对象:睁开眼,你看到的一切的事物都是一个个的对象,你可以把对象理解为一个具体的事物(事物即数据和动作的结合体)

    (例如:铅笔是对象,人是对象,房子是对象,狗是对象)

    3、类与对象的关系:对象都是由类产生的,上帝造人,上帝首先有一个造人的模板,这个模板即人的类,然后上帝根据类的定义来生产一个个的人。

    4、什么叫实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例=对象)

     5.1 类相关知识

    5.1.1 初识类

    在python中声明函数与声明类相似

    声明函数:

    1 def functionName(args):
    2     '函数文档字符串'
    3     函数体

    声明类:

    '''
    class 类名:
        '类的文档字符串'
         类体
    '''
    
    #我们创建一个类
    class Data:
        pass
    #用类Data实例化出一个对象d1
    d1=Data()

    5.1.2 属性

    类是用来描述一类事物,类的对象指的是这一类事物中的一个个体

    是事物就要有属性,属性分为:

    1、数据属性:就是变量

    2、函数属性:就是函数,在面向对象里通常称为方法

    注意:类和对象均用点来访问自己的属性

    5.1.3 类的属性

    理论:数据属性即变量,类的定义与函数又极其类似,其实可以用函数的作用域来理解类的属性调用

    查看类的属性:

    我们定义的类的属性到此存到哪里了?有两种方式查看

    dir(类名):查出的是一个名字列表

    类名.__dict__:查出的是一个字典,key为属性名,value为属性值

    '''
    1、数据属性
    2、函数属性
    '''
    class Chinese: ##类名首字母大写
        '这是一个中国人的类'
        dang='民政党'
        def sui_di_tu_tan():
            print('朝着墙上就是一口痰')
        def cha_dui(self):
            print('插到了前面')
    
    print(Chinese.dang)
    Chinese.sui_di_tu_tan()
    Chinese.cha_dui('zhurui')
    
    # print(dir(Chinese))
    # print(Chinese.__dict__) ##查看类的属性字典
    print(Chinese.__dict__['dang'])
    Chinese.__dict__['sui_di_tu_tan']()
    Chinese.__dict__['cha_dui'](1)

     5.2 对象相关知识

     对象是由类实例化而来,类实例化的结果称为一个实例或者称作一个对象

     5.2.4 查看实例属性

    同样是dir和内置__dict__两种方式

     5.2.5 特殊实例属性

    __class__

    __dict__

    '''
    1.数据属性
    2.函数属性
    '''
    class Chinese:
        '这是一个中国人的类'
    
        dang='民政党'
    
        # def __init__(name,age,gender):
        #     dic={
        #         'name':name,
        #         'age':age,
        #         'gender':gender
        #     }
        #     return dic
        def __init__(self,name,age,gender):
            # print('我是初始化函数,我开始运行了')
            self.mingzi=name  #p1.mingzi=name
            self.nianji=age   #p1.nianji=age
            self.xingbie=gender
            # print('我结束啦')
    
        def sui_di_tu_tan(self):
            print('%s 朝着墙上就是一口痰' %self.mingzi)
        def cha_dui(self):
            print(self)
            print('%s 插到了前面' %self.mingzi)
    
        def eat_food(self,food):
            print('%s 正在吃%s' %(self.mingzi,food))
    
    p1=Chinese('元昊',18,'female') #--->__init__(self,name,age,gender)
    p1.sui_di_tu_tan()
    p1.eat_food('屎')
    
    p2=Chinese('武sir',10000,'姑娘')
    p2.eat_food('韭菜馅饼')
    print(dir(p2))
    #
    # # p1=Chinese.__init__(p1,name,age,gender)
    #
    # print(p1.__dict__)
    # # print(p1.__dict__['xingbie'])
    # print(p1.mingzi)
    # # print(p1.mingzi111111111111111)
    #
    # print(p1.dang)
    #
    #
    # print(Chinese.__dict__)
    # Chinese.sui_di_tu_tan()
    # Chinese.cha_dui(p1)
    #
    # # p1.sui_di_tu_tan()
    #
    # print('[------------------->')
    # p1.cha_dui()

    警告:类和对象虽然调用__dict__返回的是一个字典结构,但是千万不要直接修改该字典,会导致你的opp不稳定

    5.3 类属性与对象(实例)属性

    类属性(增删改查):

    #类的属性
    '''class ChinesePeople:
        country='China'
        def __init__(self,name):
            self.name=name
    
        def play_ball(self,ball):
            print('%s 正在打 %s' %(self.name))
    
    def say_word(self,word):
        print('%s 说 %s' %(self.name,word))
    
    #查看类属性
    print(ChinesePeople.country)
    
    #修改类属性
    ChinesePeople.country='CHINA'
    print(ChinesePeople.country)
    #删除类属性
    del ChinesePeople.country
    #增加类属性
    ChinesePeople.country='China'
    ChinesePeople.location='Asia'
    print(ChinesePeople.__dict__)
    #类的数据属性增删改查与函数属性是一样的
    ChinesePeople.say_word=say_word
    print(ChinesePeople.__dict__)
    '''
    
    class Chinese:
        country='China'
        def __init__(self,name):
            self.name=name
    
        def play_ball(self,ball):
            print('%s 正在打 %s' %(self.name))
    #查看
    print(Chinese.country)
    
    #修改
    Chinese.country='Japan'
    print(Chinese.country)
    
    p1=Chinese('simon')
    print(p1.__dict__)
    print(p1.country)
    
    #增加
    Chinese.dang='民政党'
    
    # print(Chinese.dang)
    # print(p1.dang)
    
    #删除
    del Chinese.dang
    del Chinese.country
    
    print(Chinese.__dict__)
    # print(Chinese.country)
    
    def eat_food(self,food):
        print('%s 正在吃%s' %(self.name,food))
    
    Chinese.eat=eat_food
    
    print(Chinese.__dict__)
    p1.eat('饭')
    
    def test(self):
        print('test')
    
    Chinese.play_ball=test
    p1.play_ball()# Chinese.play_ball(p1)

    实例属性(增删改查):

    class Chinese:
        country='China'
        def __init__(self,name):
            self.name=name
    
        def play_ball(self,ball):
            print('%s 正在打 %s' %(self.name,ball))
    p1=Chinese('simon')
    print(p1.__dict__)
    
    #查看
    # print(p1.name)
    # print(p1.play_ball)
    
    #增加
    p1.age=18
    print(p1.__dict__)
    print(p1.age)
    
    #不要修改底层的属性字典
    # p1.__dict__['sex']='male'
    # print(p1.__dict__)
    # print(p1.sex)
    
    #修改
    p1.age=19
    print(p1.__dict__)
    print(p1.age)
    
    #删除
    del p1.age
    print(p1.__dict__)
  • 相关阅读:
    vue 设置全局变量、指定请求的 baseurl
    npm ERR! missing script: build
    npm install 报错,提示`gyp ERR! stack Error: EACCES: permission denied` 解决方法
    vue-cli 4 安装与 新建项目 路由
    PHP7安装redis扩展
    C#中的list的System.Predicate<in T>和System.Comparison<in T>的应用
    6个2教你认识递归的力量!
    C#中的预编译指令介绍[转]
    C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]
    GOTO语句以及GOTO机制的模式实现
  • 原文地址:https://www.cnblogs.com/hackerer/p/11204135.html
Copyright © 2020-2023  润新知