第一个特性:封装
封,字面意思;封,封口,只留下一个对外展示的接口
装,将一些数据或功能集合在一起
隐藏
在类中如果在一个属性名前加上,就可以属性隐藏起来(无论的类调用还是直接调用均无法看到)
其实开头的属性会被修改(类名属性名),在类外部调用的时候可以使用此方法调用
在类内部使用仍是属性名的方法,也就是说该隐藏是对外不对内的
该隐藏操作是在类的定义阶段扫描语法时发生的变形,类定义之后添加的_开头的属性不会发生变形
把功能属性隐藏起来的目的就是来隔离复杂度
class Student:
school = 'oldboy'
def __init__(obj, x, y, z):
obj.__name = x
obj.age = y
obj.gender = z
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
return self.__name
def del_name(self):
del self.__name
# peoperty 功能 在外界直接操作最新变量name
name = property(get_name, set_name, del_name) # 三个功能集成到一个变量名内
# 集查询,修改,删除与一身
obj = Student('egon', 19, 'male')
print(obj.name) # 查询名字
obj.name = 'tank' # 修改名字
print(obj.name) # 修改后的名字查看
del obj.name # 删除名字
装饰器
上方代码的功能看着不够清晰,name太多容易让人混乱,python就有一个很好用的东西:装饰器
class Student:
school = 'oldboy'
def __init__(obj, x, y, z):
obj.__name = x
obj.__age = y
obj.gender = z
@property # 查询操作在被隐藏功能上方加 @property 装饰器即可
def age(self):
return self.__age
@age.setter # 修改操作需要下方变量名.setter
def age(self, name):
self.__age = name
return self.__age
@age.deleter # 删除操作需要下方变量名.deleter
def age(self):
del self.__age
# 此处无需再将三个功能赋值给新变量名,但需要函数名统一
obj = Student('egon', 19, 'male')
print(obj.age) # 查询年龄
obj.age = 20 # 修改年林
print(obj.age) # 修改后的年龄查看
del obj.age # 删除年龄
绑定方法
类中定义的函数:谁来调用就会将谁当成第一个参数传入
绑定给对象的方法:类中定义的函数默认是绑定给对象用的,应该由对象来调用,会将对象当成第一个参数传入
绑定给类的方法:再类中的函数加上一个装饰器@classmethod,那么该函数就绑定给类了,应该由类来调用,会把类当成第一个参数传入(对象仍可用,但是只能用非绑定的函数)
非绑定方法:既不与类绑定又不与对象绑定,就是一个存在于类中的普通的函数,直接通过函数名来调用,谁都可以来调用,没有自动传参的效果@staticmethod
class People:
def init(self, name, age):
self.name = name
self.age = age
def tell_info(self):
print('%s:%s' % (name, age))
@classmethod
def f2(cls):
print(cls.f1(234, 234, 324)) # 类来调用,将类当成参数传入,可调用类中的非绑定f1函数
@staticmethod
def f1(x, y, z):
print(x, y, z)
obj = People('egon', 18)
People.f2() # 类来调用绑定给类的方法f2
People.f1(12, 34, 56) # 非绑定的方法f1,类可直接调用
obj.f1(34, 34, 45) # 非绑定的方法f1,对象可直接调用
obj.f2() # 对象仍可调用绑定给类的方法f2,类来调用,纯粹是可以用,没什么实际用
网友评论