前言
封装,前篇简单了解了封装,然后私有方法、私有属性,还可以有私有属性对外部的约束这篇将会简单介绍。
面向对象函数:property、classmethod、staticmethod
一、封装
1、私有方法属性的约束,只能是字符串且非纯字符串的全数字
# 1、私有方法属性的约束,newName 只能是字符串且非纯字符串的全数字 class Login: def __init__(self, name, pwd): self.__name = name self.__pwd = pwd def get_name(self): return self.__name def set_name(self, newName): '''约束属性:newName,字符串且非纯字符串的数字''' if type(newName) is str and newName.isdigit() == False: self.__name = newName else:print('输入的类型有误,请重新输入!') if __name__ == '__main__': r = Login('广深小龙', 123) print(r.get_name()) r.set_name('小龙龙') print(r.get_name()
2、父类的私有属性,也不能被子类调用:
So 私有属性只能在本身类中调用。
# 2、父类的私有属性也不能被子类调用 class A: __pwd = 666 class B(A): print(A.__pwd) # 没实例化运行都直接报错
总结:
- 1.隐藏起一个属性 不想让类的外部调用
- 2.我想保护这个属性,不想让属性随意被改变
- 3.我想保护这个属性,不被子类继承
二、面向对象函数
①property内置装饰器函数,只能对面向对象中使用,可对函数的 私有属性进行删改
1、property:装饰该方法,方法伪装成为一个属性,少写了一个括号:
# 1、property:装饰该方法,方法伪装成为一个属性,少写了一个括号 class A: def __init__(self, num): self.__num = num @property # 装饰该方法,方法伪装成为一个属性 def square(self): return self.__num*self.__num r = A(-2) print(r.square) # 实例化调用方法就不用加括号:r.square,方便将它传入下一个
2、setter:对对象的修改,两个函数名参数要一样,@property,@函数.setter
# 2、setter:对对象的修改,两个函数名参数要一样,@property,@函数.setter class A: def __init__(self,name): self.__name = name @property # 装饰该方法 def f_name(self): return '非主流-'+self.__name @f_name.setter def f_name(self, newName): self.__name = newName r = A('广深小龙') print(r.f_name) r.f_name = '小龙女' print(r.f_name)
3、deleter:property装饰器函数,属性删除
property装饰器,借助公有的del关键字,进行删除。
# 3、deleter:property装饰器函数,属性删除 class A: def __init__(self, name): self.__name = name @property def name(self): return self.__name @name.deleter def name(self): del self.name r = A('广深小龙') print(r.name) del r.name print(r.name)
②classmethod:类方法,类能直接调用,不需要实例化
1、类方法,cls是默认参数:
只涉及静态属性的时候,就应使用这个classmethod装饰该方法
# 1、classmethod:类方法,cls是默认参数 # 只涉及静态属性的时候,就应使用这个classmethod装饰该方法 class Goods: discount = 0.5 def __init__(self, name, price): self.name = name self.__price = price @property def prices(self): return self.__price*self.discount @classmethod # 装饰后不需实例化,直接能操作 def update(cls, Newdiscount): cls.discount = Newdiscount r = Goods.update(2) # classmethod装饰后不用传对象 res = Goods('雪梨', 6) print(res.prices)
③staticmethod:静态方法
1、静态方法,没有默认参数,像个函数一样:
# 1、staticmethod:静态方法 class Login: def __init__(self, usr, pwd): self.usr = usr self.pwd = pwd def login(self): return '登录成功!!!' @staticmethod def usr_pwd(): # 静态方法,没有默认参数,像个函数一样 usr = input('请输入您的账号:') pwd = input('请输入您的密码:') return Login(usr, pwd) r = Login.usr_pwd() print(r.login())
欢迎来大家QQ交流群一起学习:482713805 !!!