• 面向对象——组合、封装、访问限制机制、property内置装饰器


    面向对象——组合、封装、访问限制机制、property

    组合

    什么是组合?

    组合指的是一个对象中,包含另一个或多个对象

    为什么要组合?

    减少代码的冗余

    怎么用组合?

    # 综合实现
    # 父类
    class People:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    # 老师类
    class Teacher(People):
        def __init__(self, name, age, sex):
            super().__init__(name, age, sex)
    
    
    # 学生类
    class Student(People):
        def __init__(self, name, age, sex):
            super().__init__(name, age, sex)
    
    
    # 日期类
    class Date:
        def __init__(self, year, month, day):
            self.year = year
            self.month = month
            self.day = day
    
        def tell_birth(self):
            print(f"""
            ========== 出生年月日 =========
                年:{self.year}
                月:{self.month}
                日:{self.day}  
            """)
    
    
    tea1 = Teacher('tank', 25, "男")
    date_obj = Date(1994, 6, 6)
    tea1.date_obj = date_obj
    print(tea1.name, tea1.age, tea1.sex)
    tea1.date_obj.tell_birth()
    

    PS:继承是类与类的关系,子类继承父类的属性,是“从属关系”

    组合是对象与对象的关系,一个对象拥有另一个对象的属性和方法,是“什么有什么的关系”

    封装

    什么是封装?

    封装指的是可以将一堆属性和方法封装到对象中

    PS:存不是目的,目的是为了取,可以通过 对象. 的方式获取属性和方法

    为什么要封装?

    为了更方便数据的存取

    如何实现封装?

    # 封装很简单
    class User:
        # 将x封装到User类中
        x = 10
        # 将func方法封装到User类中
        def func(self):
            pass
    
    obj = User
    print(obj.x)
    

    访问限制机制

    什么是访问限制机制?

    凡是在类内部定义的属性或方法以__开头的名字,都会被限制,外部不能直接访问

    PS:凡是在类内部定义的属性或方法,都会变形为_类名__属性/方法(python特有的)

    class User:
        __name = "kang"
    
        def __run(self):
            print("kang is running....")
    
    
    # print(User.__name)
    obj = User()
    print(obj._User__name)		# kang
    

    为什么要有访问限制机制?

    可以将一些隐私的数据,隐藏起来,不让外部轻易获取

    class User:
        __name = "kang"
        __age = 18
        __sex = "男"
        __ID = 2156131316561316516131
        __bal = 1500000000000000000
    
        def parse_user(self, username, password):
            if username == "kang" and password == "123":
                print(f"""
                通过验证,获取用户信息
                用户名:{self.__name}
                用户年龄:{self.__age}
                用户性别:{self.__sex}
                用户ID:{self.__ID}
                用户资产:{self.__bal}
                """)
            else:
                print("校验失败,无法查询用户信息")
    
        def __run(self):
            print("kang is running....")
    
    
    obj = User()
    obj.parse_user("kang", "123")
    

    property

    什么是property?

    property是一个python内置的装饰器,可以装饰在类内部的方法

    可以将该方法调用方式由 对象.方法() 转换为 对象.方法 (少了括号)

    为什么用property?

    在某些场景下,调用的方法只是用来获取计算后的某个值

    必须通过 对象.方法() 方式调用,让该方法看起来像动词

    目的是为了迷惑调用者,调用的方法误以为是属性,让名词的方法,调用时更加合理

    怎么用?

    class User:
        def __init__(self, name, weight, height):
            self.__name = name
            self.weight = weight
            self.height = height
    
        @property
        def bmi(self):
            return self.weight / (self.height ** 2)
    
        @property
        def name(self):
            return self.name
    
        @name.setter
        def name(self, value):
            self.__name = value
    
        @name.deleter
        def name(self):
            del self.name
    
    
    user_obj = User("kang", 50, 1.7)
    print(user_obj.bmi)		# 这里user_obj.bmi后面应该有括号的,但是用了property就不用了
    
  • 相关阅读:
    数据库连接池-配置 wallfilter问题解决-UncategorizedSQLException
    maven统一配置
    maven依赖排除
    list排序
    spring boot日志配置
    HDU 5281 Senior's Gun (贪心)
    Saving HDU (贪心)
    切割木板 (贪心)
    查找最少标记点 (贪心)
    字典序最小问题 (贪心)
  • 原文地址:https://www.cnblogs.com/aheng/p/11945172.html
Copyright © 2020-2023  润新知