封装
第一个层面:对象能拿到类的东西,但是类拿不到对象的
创建类和对象会分别创建二者的名称空间,我们只能用类名,或者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装饰器的方法就是非绑定方法,其实就是一个普通的函数