美文网首页大数据 爬虫Python AI Sql
python基础之面向对象编程

python基础之面向对象编程

作者: Python新视界 | 来源:发表于2019-12-30 15:59 被阅读0次

    面向对象编程思想

    面向对象是一门编程思想,编程思想仅仅是一门思想,与任何技术无关

    核心是对象两字,对象可以理解为特征与技能的结合体

    基于该编程思想编写程序,就好比创造世界,一种造物主的思维方式

    优点:可扩张性强

    缺点:编写程序的复杂难度比面向过程高

    以上都是纯理论,理解下用自己的话能编出来就行,下面来说说核心对象

    在现实世界中,通过一个个的对象,根据相同的特征和行为,再分门别类。

    但是在程序中,必须先有类,再通过调用类,创建对象

    那么,咱们如何定义类,又如何创建对象呢?(暂时还是先说理论吧,不然看代码,估计直接懵逼了……)

    关于类的致命三问:什么是类?有什么用?怎么使用?

    类的定义:就是类型、类别,跟现实的分类类似。是一系列对象之间相同特征和行为(技能)的结合体

    类的作用:个人理解,就是为了创建对象用的。

    (终于要写代码了,哈哈哈哈哈哈哈)

    类的语法

    class 类名:

        特征  # 在python 中,用变量来表示特征

        行为  # 在python 中,用函数来表示行为,也就是大家所说的技能

    现在,我们来写一个人类,人类的特征有名字年龄性别,行为有吃饭跑步,撸代码了!

    """

    人类

        特征:名字、年龄、性别

        行为:吃饭、跑、玩

    """

    class Person:

        # 这些都是人的特征

        name = "dawn"  # 姓名

        age = 27  # 年龄

        sex = "男"  # 性别

        # 这些都是人的行为(技能)

        def eat(self):

            # 吃饭

            print("民以食为天o(∩_∩)o 哈哈")

        def run(self):

            # 跑步

            print("英雄救美,不存在的!别怂!赶紧跑!!!")

        def play(self):

            # 玩

            print("大爷!欢迎下次来玩儿啊!")

    print(Person)       

    print(Person.name)

    print(Person.play)

    输出结果

    <class '__main__.Person'>      # Person 的打印结果

    dawn            # Person.name 的打印结果

    <function Person.play at 0x0000022E54FA7DC8>  # Person.play 的打印结果

    瞅了这么久,发现了吗?类名,类的行为,类的属性都是咋用的?(理论又来了~~~)

    类名的命名规范:使用驼峰命名法,即单词的首字母得大写!

    类提供了一种便捷的获取名字的方式,就是类名.名字。类的名字包含特征和行为。咱们将类的特征称之为属性,类的行为称之为方法

    在类的内部定义函数(也就是行为的时候,默认有一个参数self),这个是干啥的,等会说

    通过输出的内容来看,类名指向的是类的内存地址。如何来查看类的名称空间呢?看代码……

    print(Person.__dict__)

    输出结果

    {'__module__': '__main__', 'name': 'dawn', 'age': 27, 'sex': '男', 'eat': <function Person.eat at 0x00000228C1683558>, 'run': <function Person.run at 0x00000228C1683B88>, 'play': <function Person.play at 0x00000228C1687DC8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

    惊不惊喜!意不意外!对,这就是Person类的名称空间中的内容!!!也就是说类的名称空间是在定义阶段产生

    到这里,咱们就该聊聊类是如何使用的了。前面咱就说了,类的调用就是对象的创建。说的类的使用就得知道对象是啥了!耐心点,好玩的还在后面!

    哈哈哈哈哈!我三连问回来啦!——什么是对象?有什么用?怎么使用?

    对象的定义特征与技能的结合体

    语法:类名()

    咱们来瞅瞅对象是如何创建的,类又是如何调用的 !

    # 上面咱定义了一个Person类,这里直接拿来用

    # 调用Person类后会产生一个对象,使用一个变量接收

    p1 = Person()

    # 输出p1 的属性

    print(p1.name, p1.age, p1.sex)

    # 使用p1 的方法

    p1.play()

    p1.run()

    p1.eat()

    输出结果

    dawn 27 男  # p1的属性

    大爷!欢迎下次来玩儿啊!    # p1.play()的结果

    英雄救美,不存在的!别怂!赶紧跑!!!  # p1.run()的结果

    民以食为天o(∩_∩)o 哈哈  # p1.eat()的结果

    刚刚获取了对象的属性(也就是查询),发现没有,这些属性都是类的,我们能否对对象的属性做个增删改呢?如果修改了对象的属性,类是否随之改变呢?动手试试

    修改对象的属性,其实就是对象自己增加了属性

    # 修改属性

    print(Person.__dict__)  # 修改前,Person的名称空间

    print(p1.__dict__)      # 修改前,p1的名称空间

    p1.name = "haha"        # 修改对象的name 属性,实际上是p1对象自己新增了name 属性

    print(Person.__dict__)  # 修改后,Person的名称空间

    print(p1.__dict__)      # 修改后,p1的名称空间

    输出结果

    增加对象的属性

    # 增加属性

    print(p1.__dict__)

    print(Person.__dict__)

    p1.hobby = "read"

    print(p1.__dict__)

    print(Person.__dict__)

    输出结果

    删除对象的属性

    # 删除属性

    del p1.sex

    print(p1.sex)

    print(Person.__dict__)

    输出结果

    纵观以上的结果,咱说了那些属性都在类的名称空间里,那么有没有什么方法,让这些属性是通过对象来增删改查的呢?

    当然有的啦!那就是__init__()!我们来看看使用方式

    # 定义一个类

    class Person:

        # 这些都是人的特征

        name = "dawn"  # 姓名

        # __init__()

        def __init__(self, name, age, sex):

            self.name = name

            self.age = age

            self.sex = sex

        # 这些都是人的行为(技能)

        def eat(self):

            # 吃饭

            print("民以食为天o(∩_∩)o 哈哈")

    # 通过类创建两个对象,分别是p1和p2

    p1 = Person("haha", 39, "男")

    p2 = Person("lee", 21, "女")

    # 查看Person类的名称空间

    print(Person.__dict__)

    # 查看对象p1的名称空间

    print(p1.__dict__)

    # 查看对象p2的名称空间

    print(p2.__dict__)

    输出结果

    发现什么了没有?

    __init__()实现了对象的个性化定制,而且创建对象在传参时,没有传self这个参数。

    那是因为__init__()在调用时,会将对象本身作为第一个参数传入。原因后期学习以后,才知道。现在就做一个总结好了

    由对象来调用类的内部函数,称为对象的绑定方法。对象的绑定方法特殊之处在于:会将对象本身当作第一个参数传入方法(咱可以回头看看定义类的时候,是不是每个行为也就是方法,都有self参数)

    __init__()在调用类时触发,会做以下事情:

    将对象本身当作第一个参数传入方法(原因:对象的绑定方法)

    调用时,传入的其他参数一并被__init__()接收

    接着,我们来看看,对象是如何对属性做增删改查的

    # 获取p1的属性

    print(f"姓名:{p1.name},性别:{p1.sex},年龄:{p1.age}")

    # 修改p1的属性

    print(f"修改前,p1的名称空间:{p1.__dict__}")

    p1.age = 27

    print(f"修改后,p1的属性值:{p1.age}")

    print(f"修改后,p1的名称空间:{p1.__dict__}")

    输出结果

    再来看看增加(前面就已经举例了,算了还是再举一个吧)和删除

    # 获取p1的属性

    print(f"姓名:{p1.name},性别:{p1.sex},年龄:{p1.age}")

    # 增加属性

    print(f"增加hobby前:{p1.__dict__}")

    p1.hobby = "read"

    print(f"hobby的取值:{p1.hobby}")

    print(f"增加hobby后:{p1.__dict__}")

    # 删除属性

    print(f"删除sex前:{p1.__dict__}")

    del p1.sex

    print(f"删除sex后:{p1.__dict__}")

    输入结果

    还有个地方,就是咱刚才一直在说名称空间,那么类的名称空间和对象的名称空间,有什么关系呢?

    咱们继续看代码

    # 通过类创建一个对象

    p1 = Person("haha", 39, "男")

    # 查看Person类的名称空间和属性

    print(f"Person的名称空间:{Person.__dict__}")

    print(f"Person的name属性值:{Person.name}")

    # 查看对象p1的名称空间和属性

    print(f"p1的名称空间:{p1.__dict__}")

    print(f"p1的name属性值:{p1.name}")

    # 删除p1的属性name,再打印p1的名称空间和属性

    del p1.name

    print(f"删除name属性后,p1的名称空间:{p1.__dict__}")

    print(f"删除name属性后,p1的name属性值:{p1.name}")

    输出结果

    看到没?对象的属性删除后,再去调用这个属性,并没有报错,而是将类中的同名属性值获取了过来

    那如果类中没有这个属性呢?我们再来看看

    class Person:

        # 这些都是人的特征

        def __init__(self, name, age, sex):

            self.name = name

            self.age = age

            self.sex = sex

    # 通过类创建一个对象

    p1 = Person("haha", 39, "男")

    # 查看对象p1的名称空间和属性

    print(f"p1的名称空间:{p1.__dict__}")

    print(f"p1的name属性值:{p1.name}")

    # 删除p1的属性name,再打印p1的名称空间和属性

    del p1.name

    print(f"删除name属性后,p1的名称空间:{p1.__dict__}")

    print(f"删除name属性后,p1的name属性值:{p1.name}")

    输出结果

    报错了!!!由此我们可以总结下:

    对象先从自身名称空间查找,没有就去类的名称空间查找,再没有就会报错。

    对象名字的查找顺序:

    对象自身----→----→都没有,报错

    定义类及调用的固定模式

    class 类名:

        def __init__(self,参数1,参数2):

            self.对象的属性1 = 参数1

            self.对象的属性2 = 参数2

        def 方法名(self):pass

        def 方法名2(self):pass

    对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西

                      #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法

                      #括号里传参数,参数不需要传self,其他与init中的形参一一对应

                      #结果返回一个对象

    对象名.对象的属性1  #查看对象的属性,直接用 对象名.属性名 即可

    对象名.方法名()    #调用类中的方法,直接用 对象名.方法名() 即可

    相关文章

      网友评论

        本文标题:python基础之面向对象编程

        本文链接:https://www.haomeiwen.com/subject/vnjmoctx.html