美文网首页
python学习笔记-(4)面向对象

python学习笔记-(4)面向对象

作者: MR_詹 | 来源:发表于2020-09-06 16:00 被阅读0次

    类定义格式

    class类名:
        代码
    
    例子
    class Washer():
      /// 对象方法
      def wash(self):
        print('洗衣服功能')
    
    haier = Washer()
    
    haier.wash()
    

    添加和获取对象属性

    • 类外面添加对象属性
    格式
    对象命.属性名 = 值
    
    • 类外面获取对象属性
    对象命.属性名
    
    • 类里面获取对象属性
    格式
    self.属性
    
    例子
    class Washer():
      def wash(self):  
        /// 类里面获取对象属性
        print(f'洗衣机高度{self.height}')
        print('洗衣服功能')
    
    haier = Washer()
    
    haier.height = 100
    
    

    魔法方法

    在Python中,__xx__()的函数叫做`魔法方法`,指的是具有特殊功能的函数
    
    • __init__()
    作用:初始化对象
    注意:
      1. __init__()方法,在创建一个对象时默认被调用,不需要手动调用
      2.__init__(self)中self参数,不需要开发者传递,python解释器会自动把当前对象引用传递过去
    
    例子
    class Washer():
        def __init__(self):
            #添加实例属性
            self.width = 100
            self.heigth = 200
    
        def print_info(self):
            print(f'{self.heigth}')
    
    
    haier = Washer()
    haier.print_info()
    
    • 带参数的__init__()
    class Washer():
        def __init__(self,width,height):
            #添加实例属性
            self.width = width
            self.height = height
    
        def print_info(self):
            print(f'{self.width}')
            print(f'{self.height}')
    
    
    haier = Washer(200,100)
    haier.print_info()
    
    • __str__
    当使用print输出对象的时候,默认打印对象的内存地址,如果类定义了__str__方法,那么就会打印从这个方法中return的数据
    
    例子
    class Washer():
        def __init__(self,width,height):
            #添加实例属性
            self.width = width
            self.height = height
    
        def print_info(self):
            print(f'{self.width}')
            print(f'{self.height}')
    
        def __str__(self):
            return '海尔冰箱'
    
    /// 也可以使用关键字的方式初始化对象
    haier = Washer(width=1000,height=200)
    
    print(haier)
    
    • __del__()
    当删除对象时,python解释器也会默认调用__del__()方法
    
    例子
    class Washer():
        def __del__(self):
            print('对象被删除了')
    
    haier = Washer()
    del  haier
    

    综合实例1:烤地瓜

    class SweetPotato():
        def __init__(self):
            # 烤的时间
            self.cook_time = 0
            # 烤的状态
            self.cook_state = '生的'
            # 添加的调料
            self.condiments = []
    
        def cook(self,time):
            """烤地瓜"""
            self.cook_time += time;
            if 0 < self.cook_time < 3:
                self.cook_state = '生的'
            elif 3 <= self.cook_time < 5:
                self.cook_state = '半生不熟'
            elif 5 <= self.cook_time < 8:
                self.cook_state = '熟了'
            elif self.cook_time >= 8:
                self.cook_state = '烤糊了'
    
        def add_condiments(self,condiment):
            """添加调料"""
            self.condiments.append(condiment)
    
        def __str__(self):
            return f'这个地瓜烤了{self.cook_time}分钟,现在是{self.cook_state},添加了以下的调料:{self.condiments}'
    
    
    digua1 = SweetPotato()
    print(digua1)
    digua1.cook(2)
    print(digua1)
    digua1.add_condiments('花椒粉')
    digua1.add_condiments('辣椒')
    print(digua1)
    

    综合案例2:搬家

    家具类
    class Furniture():
        def __init__(self, name, area):
            # 家具名称
            self.name = name
            # 家具占地面积
            self.area = area
    
        def __str__(self):
            return f'家具:{self.name} 占地:{self.area}'
    
    
    # 房子
    class Home():
        def __init__(self, address, area):
            # 地址
            self.address = address
            # 房子面积
            self.area = area
            # 剩余面积
            self.free_area = area
            # 家具列表
            self.frunitures = []
    
        def __str__(self):
            return f'房子的地址:{self.address},面积:{self.area},剩余面积:{self.free_area},家具:{self.frunitures}'
    
        def add_fruniture(self, item):
            if self.free_area >= item.area:
                self.free_area -= item.area
                self.frunitures.append(item)
            else:
                print('家具太大了,放不下了')
    
    
    shafa = Furniture(name='沙发', area=16)
    chuang = Furniture(name='床', area=8)
    
    jia = Home(address='广州', area=100)
    print(jia)
    jia.add_fruniture(shafa)
    print(jia)
    jia.add_fruniture(chuang)
    print(jia)
    
    

    __dict__

    类的继承

    Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。
    
    在Python中,所有类默认继承object类,object类是顶类或基类,其他子类叫做派生类
    
    Python是`多继承`:当一个类有多个父类的时候回,默认使用`第一个`父类同名属性和方法
    
    1、子类和父类具有同名属性和方法,默认使用子类的同名属性和方法
    
    2、 子类调用父类的同名方法和属性:
    super().函数名   super().属性
    /// 使用super()可以自动查找父类。调用顺序遵循__mro__类属性的顺序,比较适合单继承使用
    
    `__mro__`查看类的父类
    格式
    类.__mro__
    
    

    定义私有属性和方法

    在python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或方法不继承给子类。
    设置私有权限的方法:在属性和方法名 前面 加上两个下划线__
    

    获取和修改私有属性值

    一般定义函数名`get_xx`用来获取私有属性,定义`set_xx`用来修改私有属性
    

    类属性

    * 类属性就是 `类对象` 所拥有的属性,它被该类的`所有实例对象`所共有
    * 类属性可以使用 `类对象` 或 `实例对象` 访问
    
    /// 类属性的优点
    /// 记录的某项数据,始终保持一致时,则定义类属性
    /// 实例属性 要求 每个对象 为其 单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一分内存,更加节省内存空间
    
    class Dog():
        tooth = 10
    
    wangcai = Dog()
    xiaohei = Dog()
    
    print(Dog.tooth)
    print(wangcai.tooth)
    print(xiaohei.tooth)
    
    
    * 修改类属性
    /// 类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例对象
    
    

    类方法

    * 特点:
    需要使用装饰器`@classmethod` 来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以`cls`作为第一个参数
    
    * 使用场景
    1.当方法中需要使用类对象(如访问私有类属性等)时,定义类方法
    2.类方法一般和类属性配合使用
    
    class Dog(object):
        __tooth = 10
    
        @classmethod
        def get_tooth(cls):
            return cls.__tooth
    
    wangcai = Dog()
    print(wangcai.get_tooth())
    

    静态方法

    * 特点:
    1、 需要通过 @staticmethod 来进行修饰,静态方法即不需要传递类对象,也不需要传递实例对象(形参没有self/cls)
    2、静态方法也能够通过实例对象和类对象去访问
    
    * 使用场景
    1、当方法中 即不需要使用实例对象(如实例对象、实例属性),也不需要使用类对象(如类属性,类方法,创建实例等)时,定义静态方法
    2、取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗
    
    
    class Dog(object):
        @staticmethod
        def info_print():
            print('这是一个静态方法')
    
    wangcai = Dog()
    wangcai.info_print()
    Dog.info_print()
    
    

    相关文章

      网友评论

          本文标题:python学习笔记-(4)面向对象

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