• 011-python之面向对象


    一、类

    1、什么是类,什么是对象

    类是拥有相同功能和相同属性的对象的集合 - 抽象的概念

    对象就是类的实例(类具体的表现)

    2、定义类

    定义类就是用代码描述这个类拥有哪些相同功能和相同属性的对象的集合

    程序中描述功能:函数

    程序中描述属性:变量

    语法:

    class 类名:
        类的说明文档
        类的内容
    
    • 1
    • 2
    • 3

    说明:

    class - 关键字 固定写法
    类名 - 程序员自己命名,采用驼峰命名法并且首字符大写(StudentName)
    : - 固定写法
    类的说明文档 - 多行注释
    类的内容 - 相同功能和相同属性
    		 由方法(对象方法,类方法,静态方法)和属性(对象属性,类属性)组成
        	 方法 - 定义在类中的函数
             属性 - 定义在类中的变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    class Person:
        "人类"
        age = 32  # num是属性
    
        def eat(self):  # eat是方法
            print('吃饭')
    
        def sleep(self):  # sleep是方法
            print('睡')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3、创建对象

    语法:

    对象=类名() - 创建指定类对应的一个对象,并将对象返回
    
    • 1
    class Person:
        "人类"
        age = 32  # num是属性
    # 创建两个对象
    p1 = Person()
    p2 = Person()
    print(p1, p2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、类中的方法

    1、什么是方法

    类中的方法:类中的函数 用来描述具体的功能

    2、方法分类
    方法类型定义调用什么时候用特点
    对象方法将函数直接定义在类中在类的外面 通过对象.xxx()来调用如果实现函数的功能需要用到对象属性就使用对象方法自带参数self,通过对象调用对象方法的时候不需要传参,系统自动将当前对象传给self (self,谁调用就指向谁)
    类方法在类中定义函数的时候加装饰器@classmethod通过类名.xxx()调用如果实现函数的功能不需要用对象属性需要类就使用类方法自带参数cls,调用的时候不需要传参,系统自动将当前类传给cls cls,谁调用就指向谁)
    静态方法在类中定义函数的时候加装饰器@staticmethod通过类名.xxx()调用既不需要用到对象属性也不需要用到类就用静态方法没有特点
    class A:
        def fun(self):
            print('对象方法')
        @classmethod
        def fun(cls):
            print('类方法')
        @staticmethod
        def fun():
            print('静态方法')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3、魔法方法

    方法名以__开头并且以__结尾的自带的方法就是魔法方法

    所有的魔法方法都会在特定的情况下被自动调用

    3.1 常用的魔法方法
    方法名作用
    __init__每次创建类的对象的时候会自动调用类中的__init__方法
    创建类的对象的时候 参数和参数个数由类中的__init__方法决定
    __repr__打印对象的时候自动调用 对象对应的类中的__repr__方法,
    该方法是定制打印规则(函数的返回值是什么,对象打印就是什么;返回值必须是返回值)
    class D:
        def __repr__(self):
            return 'abc'
    d = D()
    print(f'd:{d}')  # d:abc
    
    class E:
        def __init__(self):
            print('init方法')
            pass
    e1=E()  # 每次创建对象的时候自动调用类中的__init__方法
    class F:
        # 在类中添加__init__方法的时候除了方法名和方法类型不能改变,可以随意添加参数函数体
        def __init__(self,x,y):
            print(x+y)
    f1=F(1,2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    三、属性

    属性分类创建使用什么时候用
    类属性在类中直接定义一个变量在外部使用 通过类.xxx的方式当属性值不会因为对象不同而不一样的时候就使用,反之就使用对象属性
    对象属性self.属性名=值的形式定义在类的__init__方法中在外部使用 通过对象.属性名使用 通过对象.属性名=新值修改当属性值会因为对象不同而不一样的时候就使用
    class A:
        x=100 # x是类属性
    print(A.x) # 直接使用类属性 100
    A.x=200    # 修改类属性的值
    print(A.x) # 200
    
    
    class B:
        y=200
        # name age gender 是对象属性
        def __init__(self):
            self.name='cindy'
            self.age=15
            self.gender='女'
    b=B()
    print(b.name,b.age,b.gender,b.y)  # cindy 15 女 200
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    示例 2.对象属性赋初值的方式
    class Person:
        def __init__(self, name, gender = '男'):
            self.name = name        # 通过没有默认值的参数来赋值
            self.age = 1            # 赋固定值,创建对象时不能修改
            self.gender = gender    # 使用有默认值的参数来赋值,创建对象时可以修改
        def __repr__(self):
            # return f'name:{self.name},age:{self.age},gender:{self.gender}'
            return str(self.__dict__) # 把打印对象转换成字典,然后在转换成字符串
    p1 = Person('小明')
    print(p1)
    print(p1.name, p1.age, p1.gender)
    
    p2 = Person('小花', '女')
    print(p2)
    print(p2.name, p2.age, p2.gender)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    练习:圆类
    import math
    class Circle:
        pi=math.pi
        def __init__(self,radiu):
            self.radiu=radiu
        def perimeter(self):
            p=2*Circle.pi*self.radiu
            return f'周长为:{p:.2f}'
        # 在类中实现函数的功能的时候 如果需要的数据是属性则不需要提供额外的参数
        # 类属性直接用类提供
        # 对象属性直接用self提供
        def area(self):
            a=Circle.pi*self.radiu**2
            return f'面积为:{a:.2f}'
    
    circle1=Circle(3)
    print(circle1.area())
    print(circle1.perimeter())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    练习:矩形类
    class Rect:
        def __init__(self,length,width):
            self.length=length
            self.width=width
        def area(self):
            return self.width*self.length
        def perimeter(self):
            return (self.length+self.width)*2
        def __repr__(self):
            # return f'长度:{self.length},宽度{self.width}'
            return  f'<{str(self.__dict__)[1:-1]}>'
    r1=Rect(1,4)
    print(r1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    四、属性的增删改查

    1、在面向对象编程的时候可以使用对象来代替字典
    stu={'name':'lili','age':19,'gender':'女'}
    class Student:
        def __init__(self,name,age,gender):
            self.name=name
            self.age=age
            self.gender=gender
        def __repr__(self):
            return str(self.__dict__)[1:-1]
    stu1=Student('小明',17,'男')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2、对象的对象属性也支持增伤改查操作
    2.1查 获取属性值
    对象.属性获取指定属性的值,属性不存在报错
    getattr(对象,属性名)获取指定属性的值 属性不存在报错
    getattr(对象,属性名,默认值)获取指定属性的值 属性不存在返回默认值
    2.2 增&改
    方法
    对象.属性=值属性存在修改属性值,属性不存在给对象添加属性
    setattr(对象,属性名,值)属性存在修改属性值,属性不存在给对象添加属性
    2.3 删除
    方法
    del 对象.属性删除指定属性
    delattr(对象,属性名)删除指定属性
    class Student:
        def __init__(self,name,age,gender):
            self.name=name
            self.age=age
            self.gender=gender
        def __repr__(self):
            return str(self.__dict__)[1:-1]
    stu1=Student('小明',17,'男')
    print(stu1)
    delattr(stu1,'gender')
    print(stu1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2.4 hasattr
    hasattr(对象,属性名,)  判断属性是否存在
    
    • 1

    注意:attr相关函数可以动态操作对象属性

    五、继承

    1、继承

    继承就是让子类直接用拥有父类的属性和方法

    父类是一个大类,子类就是大类中的一个小分类

    2、语法
    class 类名(父类):
        类的说明文档
        类的内容
    
    
    • 1
    • 2
    • 3
    • 4

    注意:定义类的时候,没有写父类的话默认继承object(基类)

    3、在继承拥有父类的同时怎么在子类中添加内容

    子类在拥有父类的属性和方法的同时,往往需要有自己的一些属性和方法

    • 添加类属性和方法直接在子类中定义新的属性和新的方法
    • 添加对象属性在子类中__init__方法中写’super().init()’
    示例
    class Person():
        """一个人类,作为父类"""
        def __init__(self, name, age, sex):
            """父类初始化方法"""
            self.name = name
            self.age = age
            self.sex = sex
    
        def get_desc_info(self):
            print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex)
    class Student(Person):
        """一个学生类,作为子类"""
        def __init__(self, name, age, sex):
            """子类初始化方法"""
            # super.__init__(name, age, sex)  # 错误示范
            super().__init__(name,age,sex)
    student = Student('林梓然', 26, '男')
    student.get_desc_info()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    多元宇宙算法求解电力系统多目标优化问题(Matlab实现)【电气期刊论文复现与】
    汽车级应用MS913/914 25-100MHz 10/12 位用于平面显示器链路Ⅲ的具有直流平衡编码和双向控制通道的串化器和解串器
    自我介绍——当年毕业生版本
    小程序和APPH5的区别是啥?
    Missing-Semester : The Shell 笔记
    uniapp启动图.9.png制作方法
    超详细!一步到位!MySQL安装和基本使用
    SAP CRM Fiori 应用的 Deep Create 行为和实现分析
    2021.06青少年软件编程(Python)等级考试试卷(三级)
    Solana扩容机制分析(2):牺牲可用性换取高效率的极端尝试 | CatcherVC Research
  • 原文地址:https://blog.csdn.net/qq_44087994/article/details/126166309