• 28.Python面向对象(一)【类:创建类&实例对象,私有属性,类里面的方法,类属性CRUD,常用内置类属性】


    每篇前言:


    在这里插入图片描述

    Python面向对象(一)

    想必很多人都听说过面向过程和面向对象,如果没有听说过的请自行百度拓展一下知识储备,我这里就以一种很形象的说法给大家简单介绍一下它俩,让大家懂得其区别:
    在这里插入图片描述
    下面这些定义化的东西大家先看看,在心里有个印象,后面讲到哪些方面的时候,大家忘记了可以再来翻翻看看,多次记忆,加深印象,因为有些还挺容易弄混的!

    我们首先要知道类是一个抽象的概念。它是一个独立存放变量(属性/方法)的空间。(把一些事物的共有特点封装起来);而实例也是一个独立存放变量的空间(每个实例都是一个独立的变量空间,不同实例之间的空间不可见)。

    类名要大写,实例名要小写。

    实例名.属性名——>调用某一个实例属性。
    类名.属性名——>调用封装在类里面的类的属性。

    • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
    • 方法:类中定义的函数。
    • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
    • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
    • 局部变量:定义在方法中的变量,只作用于当前实例的类。
    • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
    • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
    • 实例化:创建一个类的实例,类的具体对象。
    • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

    和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。

    Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

    对象可以包含任意数量和类型的数据。

    然后一个比较重要的点是——>类编码风格:

    类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名
    和模块名都采用小写格式,并在单词之间加上下划线。
    对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的
    功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,
    对其中的类可用于做什么进行描述。
    可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,
    可使用两个空行来分隔类。
    需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的 import 语句,再
    添加一个空行,然后编写导入你自己编写的模块的 import 语句。在包含多条 import 语句的程序中,
    这种做法让人更容易明白程序使用的各个模块都来自何方。

    1.1 面向对象基础

    • 定义:
    class 类名:
    	pass
    
    • 1
    • 2
    • 例如:
    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    class Person:         #定义类名要首字母大写。
    	a = '两只手,两条腿'       	#封装在类里面类中的属性   类,是一个独立存放变量(属性/方法)的空间。
    
    wumou = Person()       #实例名 = 类名()  实例  
    zhangmou = Person()
    
    wumou.name = "吴某"    #实例的特征  实例属性 (一个实例的特征,就是属性)
    wumou.age = 18         
    zhangmou.age = 20     
    
    print(Person.a)        #调用类的属性
    print(wumou.age)       #调用实例属性
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 类与实例之间的关系:::
      (1)类:
      是一类事物的抽象,不是真实存在的,描绘了该类事物的共性。
      例如:“人”,“动物”
      (2)实例:
      某类事物的具体个体,是该类事物的具体表现,它是真实存在的。
      例如:“吴某”是具体的某个人,
      “张某”也是具体的某个人。

    1.1.1 创建类

    实例,类的帮助信息可以通过ClassName.__doc__查看:

    # -*- coding: utf-8 -*-
    """
    __author__ = 小小明-代码实体
    """
    class MyClass:
        """一个简单的类实例"""
        i = 12345
        
        def f(self):
            return 'hello world'
    
    # 实例化类
    x = MyClass()
    
    # 访问类的属性和方法
    print("MyClass 类的属性 i 为:", x.i)
    print("MyClass 类的方法 f 输出为:", x.f())
    print(MyClass.__doc__)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    • 代码实战:
    # -*- coding: utf-8 -*-
    """
    __author__ = 小小明-代码实体
    """
    class Employee:
        '所有员工的基类'
        empCount = 0
        
        def __init__(self, name, salary):
            self.name = name
            self.salary = salary
            Employee.empCount += 1
    
        def displayCount(self):
            print("Total Employee %d" % Employee.empCount)
    
        def displayEmployee(self):
            print("Name : ", self.name, ", Salary: ", self.salary)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。

    • 第一个方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

    • 类内部的方法必须有一个额外的第一个参数名称, 按照惯例它的名称是self。self代表类的实例,而不是类。self 不是 python 关键字,把它换成其他的变量名也是可以正常执行的。

    • 代码实战:

    # -*- coding: utf-8 -*-
    """
    __author__ = 小小明-代码实体
    """
    class Demo:
        def prt(self):
            print(self)
            print(self.__class__)
    
    t = Demo()
    t.prt()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    从运行结果可以看出:self 代表的是类的实例,代表当前对象的地址,而 self.__class__ 则指向类。

    1.1.2 创建实例对象

    • 实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。
    • 以下使用类的名称 Employee 来实例化,并通过 __init__ 方法接受参数。
    "创建 Employee 类的第一个对象"
    emp1 = Employee("Zara", 2000)
    "创建 Employee 类的第二个对象"
    emp2 = Employee("Manni", 5000)
    
    • 1
    • 2
    • 3
    • 4

    1.1.3 私有属性

    • 在python中有两个私有属性,分别是在属性前加一个下划线(_)和两个下划线(__)
      一个下划线外部可以直接访问,两个下划线外部不能直接访问。

    一个下划线只是做简单的标记。
    两个是私有属性,不能够直接使用。
    python当中的私有属性没有绝对的私有。

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    class Person:
    	_sex = "男"
    	__age = 18
    
    
    wumou = Person()         #实例
    
    print(Person._sex)        #调用类属性
    print(Person.__age)       #双下划线会报错,不可以直接访问双下划线变量名
    print(Person._Person__age)   #这样就可以访问双下划线的属性
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 在python中,___的使用更多的是一种规范/约定,没有真正限制的目的。
    • 定义类中的私有属性也可以被子类继承。

    小知识点:
    dir() 可以查看方法,里面可以放类名。

    1.1.4 类里面的方法

    方法就是封装在类里面的一种特殊函数。

    例:

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    class Person:
    	def sing(self):           #方法,在类里面写函数叫做在类里面定义方法。
    		print("我最帅!")      #里面有一个默认值none。   print("我最帅!",none)
    
    wumou = Person()               #定义实例,写类必备。
    
    wumou.sing()        #调用类里面的方法。      格式:实例化对象.方法()
    Person.sing(self = '要传入的东西')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    实例方法 的调用过程和 self:

    1. self:通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。
    2. 实例方法:方法总是定义在类中,但是却叫“实例方法”,因为它表示该类所有实例所共有的行为。

    小知识点:self指的是实例,谁去使用它,那么它就是谁。
    例:

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    class Person:
        def sing(self):
            print("孤寒者在唱歌%s" % self.geci)
            print(id(self))  # 会发现此处的self的id和下面的guhanzhe的id是一样的
    
    
    guhanzhe = Person()  # 在这个实例中,guhanzhe使用了self,所以self就是guhanzhe
    print(id(guhanzhe))
    # 和函数的传参一样,只是会先传一个自身的实例self
    
    guhanzhe.geci = "温暖了寂寞"
    
    guhanzhe.sing()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    1.1.5 访问对象的属性

    代码实战:

    # -*- coding: utf-8 -*-
    """
    __author__ = 小小明-代码实体
    """
    class Employee:
        '所有员工的基类'
        empCount = 0
        
        def __init__(self, name, salary):
            self.name = name
            self.salary = salary
            Employee.empCount += 1
            
        def displayCount(self):
            print("Total Employee %d" % Employee.empCount)
    
        def displayEmployee(self):
            print("Name : ", self.name, ", Salary: ", self.salary)
    
    
    # "创建 Employee 类的第一个对象"
    emp1 = Employee("Zara", 2000)
    # "创建 Employee 类的第二个对象"
    emp2 = Employee("Manni", 5000)
    
    emp1.displayEmployee()
    emp2.displayEmployee()
    print(emp1.name, emp1.salary)
    print(emp2.name, emp2.salary)
    print("Total Employee %d" % Employee.empCount)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    • 就是对类里的属性进行增删改查的操作:
    emp1.age = 7  # 添加一个 'age' 属性
    emp1.age = 8  # 修改 'age' 属性
    emp1.name="Jack" # 修改 'name' 属性
    del emp1.name  # 删除 'name' 属性
    del emp1.age  # 删除 'age' 属性
    
    • 1
    • 2
    • 3
    • 4
    • 5

    也可以使用以下函数的方式来定制属性访问:
    (1)增——如果属性不存在,会创建一个新属性。
    setattr(实例名,“属性名”,值) 或者 实例名.属性 = 值
    (2)删
    delattr(实例名,“属性名”) # 只能删除自己家的属性
    (3)改
    setattr(实例名,“属性名”,“新属性”) # 有这个属性才可以修改
    (4)查
    hasattr(实例名,“属性名”) #返回布尔值,有就True,没有就False
    或者
    getattr(实例名,“属性名”) # 存在就能取到这个值,不存在就报错
    在这里插入图片描述

    实战讲解:

    # -*- coding: utf-8 -*-
    """
    __author__ = 孤寒者
    """
    class Rectangle:
        #__init__不能使用return
        def __init__(self,length,width):
            self.length = length
            self.width = width
    
        def area(self):
            #使用self 那个实例去使用它,它就是谁
            return(self.length*self.width)
    
    a = Rectangle(4,5)
    ################查
    #判断实例有没有这个属性
    print(hasattr(a,'length'))                      #输出True
    #实例的这个属性值是什么  获取值,没有就报错
    print(getattr(a,'length'))                      #输出4
    
    ################改
    setattr(a,'width',50)                           #本来应该是5,现在改成了50
    #还可以写成: a.__setattr__('width', 50)
    print(getattr(a,'width'))                       #输出就是50
    
    ################增
    #第一种:
    #setattr  有则改,无则增
    print(hasattr(a,'name'))                        #在这里实例a里面没有属性name。输出False
    setattr(a,'name','hansha')                      #没有就增加属性name
    #还可以写成:a.__setattr__('name', 'hansha')
    print(hasattr(a,'name'))                        #上一句增加了name属性。输出True
    #第二种:
    a.age = 18
    
    ################删
    print(getattr(a,'age'))                         #因为上面增加了属性age。输出为True
    delattr(a,'age')                                #删除属性age
    #还可以写成:a.__delattr__('age')
    print(getattr(a,'age'))                         #上面删除了属性age。输出为False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    1.1.6 python内置类属性

    • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
    • __doc__ :类的文档字符串
    • __name__: 类名
    • __module__: 类定义所在的模块(类的全名是’__main__.className’,如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
    • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

    代码实战:

    # -*- coding: utf-8 -*-
    """
    __author__ = 小小明-代码实体
    """
    class Employee:
        '所有员工的基类'
        empCount = 0
        
        def __init__(self, name, salary):
            self.name = name
            self.salary = salary
            Employee.empCount += 1
            
        def displayCount(self):
            print("Total Employee %d" % Employee.empCount)
            
        def displayEmployee(self):
            print("Name : ", self.name, ", Salary: ", self.salary)
    
    print("Employee.__doc__:", Employee.__doc__)
    print("Employee.__name__:", Employee.__name__)
    print("Employee.__module__:", Employee.__module__)
    print("Employee.__bases__:", Employee.__bases__)
    print("Employee.__dict__:", Employee.__dict__)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

  • 相关阅读:
    云原生系列之docker的容器管理实战
    基于Halcon的喷码识别方法
    【Android】功能丰富的dumpsys activity
    兆易创新 GD32 系列(三) 标准库初探,点灯LED
    为gnustep项目移植到wsl的过程
    Python数据容器(字符串)
    c++day2
    AcWing-第78场周赛
    语音信号处理-基础(三):语音信号分析【连续的“模拟信号”--采样、量化、编码-->离散的“数字信号”】
    SystemVerilog-逻辑运算符
  • 原文地址:https://blog.csdn.net/qq_44907926/article/details/125588831