类的封装 、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装饰器的方法就是非绑定方法,其实就是一个普通的函数

原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11062049.html