zoukankan      html  css  js  c++  java
  • 类的封装 、property、类的绑定方法

    封装

    第一个层面:对象能拿到类的东西,但是类拿不到对象的

    创建类和对象会分别创建二者的名称空间,我们只能用类名,或者obj,的方式去访问里面的名字,这本身就是一种封装

    第二个层面:内部可以使用的,外部不可以使用,在你需要封装的属性前加上__

    类中把某些属性和方法隐藏起来(或者定义成私有的),只有在类的内部使用,外部无法访问,或者留下少量的接口(函数)供外部访问.

    #正常情况
    class A
    	def fa(self):
            print('from A')
         def test(self):
            self.fa()
    class B(A)
    	def fa(self):
            print('from B')  
    b =B()
    b.test()
    #
    from B
    
    #把fa 定义成私有的,即__fa
    Class A:
        def __fa(self):
            print('from A')
    	def test(self):
            self.__fa()
            
    class B(A)
    	def __fa(self):
            print('from B')
            
    b = B()
    b.test()
    #
    from A
    
    • 对属性这个封装有什么用:藏起来,保护了隐私,类的内部属性不想让其他人访问
    • 对方法封装有什么好处:精简了代码,不用关心其他的操作

    property特性

    • property 装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不加括号直接使用
    class Foo:
        def func(self):
            pass
        #定义property属性
        @property
        def prop(self)
        	pass
        
    foo_obj = Foo()
    foo_obj.func()  #调用实例方法
    foo_obj.prop    #调用property属性
    
    

    property属性的定义和调用要注意

    定义时,在实例方法的基础上添加@property装饰器,并且仅有一个self函数

    调用时无需括号

    property属性内部进行一系列的逻辑计算,最终将计算结果返回

    BMI计算

    class People():
        def __init__(self,height,weight)
        	self.height = height
            self.weight = weight
            
        @property
        def bmi(self):
            return self.weight/(self/height)
      
        	
    peo = People(1.8,70)
    print(peo.height)
    # 1.8
    print(peo.bmi)
    #21.604938271604937
    

    property一般用在:本来是方法,但是他应该是属性的时候,我们就应该property

    @setattr @delattr

    装饰器用法(只在Python3中使用)

    class People():
    
        def __init__(self,height,weight):
            self.height = height
            self.weight = weight
    
        @property  # 获取值的时候触发,你不需要加括号使用,不能加参数
        def bmi(self):
            return self.weight/(self.height**2)
    
        @bmi.setter  # 在修改bmi的时候触发,必须得加参数
        def bmi(self, value):
            print(f'你已经成功修改为{value}')
    
        @bmi.deleter  # 在删除bmi的时候触发,不能加参数
        def bmi(self):
            print('delter')
            
    #21.604938271604937
    **************************************************
    #你已经成功修改为50
    **************************************************
    #delter        
    

    类与对象绑定的方法

    # 绑定方法:绑定的方法
    
    class Foo:
        # 绑定给对象,只有对象能用,但是类也能使用,使用的时候必须得传参
        def f1(self):
            print(self)
    
        @classmethod  # 让被装饰的函数给类使用,约定俗称参数为cls
        # 绑定给类的方法,类能使用,对象也可以使用,但是参数依然是类
        def f2(cls):
            print(cls)
    
        # 什么都不绑定的,非绑定方法,定义了普通的函数
        @staticmethod
        def f3(self):
            print(self)
    
    f = Foo()
    f.f1()
    Foo.f1(1111)
    
    print('*' * 50)
    Foo.f2()
    f.f2()
    
    print('*'*50)
    Foo.f3(2222)
    f.f3(2222)
    
    
    # 什么时候使用?
    
    # 这个方法需要使用类做为参数的时候就得使用类绑定方法,@classmethod
    # 这个方法需要使用对象作为参数的时候就得使用对象绑定方法
    # 这方法即不需要类作为参数又不需要对象作为参数,使用非绑定方法,@staticmethod
    

    小结

    封装:隐藏属性或方法,外部无法使用,内部可以使用,在类定义阶段就执行了,真的想引用,就使用_类名__属性名

    隐藏模块内的函数/变量_x:from module import *(无法导入), from module import _x(不合理)

    @property:被 @property 装饰的函数会从函数变成属性,也就是说直接.函数名,不需要加括号使用

    @方法名.setter:被 @方法名.setter 装饰的函数,方法名修改,会执行这个装饰的函数

    '''
    @bmi.setter
    def set_bmi():
    print('setter')
    peo.bmi = 40
    '''

    @方法名.deleter:被 @方法名.deleter 装饰的函数,方法名删除,会执行这个装饰的函数

    '''
    @bmi.deleter
    def del_bmi():
    print('deleter')
    del peo.bmi
    '''

    python2中类属性调用的方法

    对象的绑定方法:没有加任何装饰的方法就是对象的绑定方法
    类的绑定方法:加了@classmethod装饰器的方法就是类的绑定方法
    非绑定方法:加了@staticmethod装饰器的方法就是非绑定方法,其实就是一个普通的函数

  • 相关阅读:
    差分隐私 differential privacy privSQL ||sql query ||sql查询系统||PrivateSQL:A Differentially Private SQL Query Engine论文笔记
    分冶法解决大整数相乘 最近对问题
    数论 矩阵交集
    STl 优先队列 C++
    备份mysql函数和存储过程
    Idea 注解模板
    excel导出
    帆软常用小技巧
    js + java文件下载
    try/finally
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11062049.html
Copyright © 2011-2022 走看看