zoukankan      html  css  js  c++  java
  • python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装

    封装

    定义:将属性和方法一股脑的封装到对象中,使对象可通过“对象.”的方式获取或存储数据。

    作用:让对象有了"."的机制,存取数据更加方便

    # 定义类,调用类创建对象,这个过程可理解为封装
    class Teacher:
        def __init__(self, name, age, gender):
            self.name = name
            self.age = age
            self.gender = gender
    
        def score(self):
            print(f"{self.name}老师正在修改分数……")
    
    
    tea = Teacher("lee", 27, "男")
    print(tea.name, tea.age, tea.gender)
    tea.score()
    

    访问限制机制

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

    这种机制看起来像是将属性和方法隐藏起来了,__开头的属性或方法,等价于 _类名__属性_类名__方法()

    作用:将隐私数据,隐藏起来,不让外部轻易获取。

    与其他编程语言的区别:

    其他语言就是私有化,限制访问。但在python中,仅仅是隐藏,这是python独有的特性

    class Person:
        __name = "lee"
        __age = 18
        __gender = "男"
    
        def __init__(self, name, age, gender):
            self.__name = name
            self.__age = age
            self.__gender = gender
    
        def __userinfo(self):
            print(f"姓名:{self.__name},年龄:{self.__age},性别:{self.__gender}")
    
    
    person = Person("dawn", 27, "男")
    print(person.__name)  # 输出报错 AttributeError: 'Person' object has no attribute '__name'
    person.__userinfo()  # 输出报错 AttributeError: 'Person' object has no attribute '__userinfo'
    
    # 被__修饰的属性或者方法,可以通过 _类名__属性或_类名__方法名() 来访问
    print(person._Person__name)  # 输出结果:dawn
    person._Person__userinfo()  # 输出结果:姓名:dawn,年龄:27,性别:男
    

    __修饰的属性和方法,只能在当前类中使用

    class A:
        def __fa(self):  # 4._A_fa()
            print('from A') # 5.最终输出的是就是 from A
    
        def test(self):  # 2.test(b) 虽然这里传入的是对象b
            self.__fa()  # 3.但是因为类的访问限制机制,这里强制换成成了 _A__fa()
    
    
    class B(A):
        def __fa(self):  # _B__fa()
            print('from B')
    
    
    b = B()
    b.test()  # 1.对象b 和当前子类B 中都没有 test(),所以去父类A中查找
    

    输出结果

    from A
    

    property

    定义: python内置的装饰器,用于将对象.方法()调整成对象.方法,类似获取属性的方式调用方法。

    作用:在某些情况下,方法返回的仅仅是处理后的数据。为了让调用者更方便的使用,将方法的调用方式修改成了类似属性的调用方式。

    class User:
        def __init__(self, weight, height):
            self.weight = weight
            self.height = height
    
        @property
        def bmi(self):
            return self.weight / (self.height ** 2)
    
    
    # 创建user对象
    user_obj = User(46, 1.56)
    # bmi()方法使用了property装饰器,调用的时候,不加()
    print(user_obj.bmi)  # 输出结果:18.902038132807363
    # 调用时,加了(),相当于user_obj.bmi()()
    print(user_obj.bmi()) # 报错 TypeError: 'float' object is not callable
    

    加了property装饰器后,调用者很容易将方法当作属性去修改或者删除.但是方法是不能通过对象.去修改删除的。

    为了让调用者可以像处理属性一样的去修改或者删除,python提供了@被装饰方法名.setter来修改方法,@被装饰方法名.delter来删除方法

    class User:
        def __init__(self, weight, height):
            # self.name = name
            self.weight = weight
            self.height = height
            self.__getbmi = self.weight / (self.height ** 2)
    
        @property  # 对象.bmi() ----→ 对象.bmi
        def bmi(self):
            return self.__getbmi
    
        @bmi.setter  # 允许修改 对象.bmi()中的值
        def bmi(self, value):
            self.__getbmi = value
    
        @bmi.deleter  # 允许删除 对象.bmi()中的值
        def bmi(self):
            del self.__getbmi
    
    
    # 创建user对象
    user_obj = User(46, 1.56)
    # print(user_obj.bmi())  # 报错,user_obj.bmi() ----→ user_obj.bmi()()
    print(user_obj.bmi)  # 输出结果:18.902038132807363
    user_obj.bmi = 18  # 修改bmi 的值。
    print(user_obj.bmi)  # 输出结果:18
    del user_obj.bmi  # 删除bmi
    print(user_obj.bmi)  # 报错,bmi 被删除了
    
  • 相关阅读:
    rt_thread studio结合cubmx进行stm32驱动开发学习
    rt_thread之时钟管理
    rt_thread线程间通讯
    使用jQuery开发iOS风格的页面导航菜单
    使用jQuery开发一个带有密码强度检验的超酷注册页面
    使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
    [英] 推荐 15 个 jQuery 选择框插件
    JavaScript封装Ajax(类JQuery中$.ajax()方法)
    阿里前端电话面试
    基于HTML5的Web跨设备超声波通信方案
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11946759.html
Copyright © 2011-2022 走看看