一、属性私有化
(一)使用私有属性场景:
1、把特定一个属性隐藏起来,不想让类的外部进行直接调用
2、保护该属性,不想让属性随意改变
3、保护该属性,不让派生类去继承
(二)小结
1、私有化实例属性,不能在外部直接访问,可以通过类的内部随意使用
2、子类不能继承父类私有化属性,只能继承共有属性
3、在属性名前直接加“__”,就可以变为私有哈
class Person: __hobby='跳舞'#私有类属性 def __init__(self): self.__name='李四'#加两个下划线,将此属性私有化,之后不能再外部直接访问 self.age=30 def __str__(self): return '{}的年龄是{}爱好是{}'.format(self.__name,self.age,self.__hobby)#私有化属性内部可是使用 def change(self):#内部修改私有化属性 Person.__hobby='唱歌' xl=Person() #print(xl.__name)#通过类对象外部访问,不能访问私有属性 print(xl) #rint(Person.__hobby) class Student(Person): def printInfo(self): print(self.__name) pass stu=Student() #print(stu.__name) #stu.printInfo() #print(stu.__hobby) stu.change()#修改私有属性的值 print(stu)
二、私有化方法
class Animal: def __eat(self):#私有化方法 print('吃东西') def run(self): self.__eat()#调用私有化方法 print('飞快地跑') class Bird(Animal): pass b1=Bird() #b1.eat() b1.run()
三、property
#法一 class Person(): def __init__(self): self.__age=18 def get_age(self): return self.__age def set_age(self,age): if age<0: print('年龄不能小于0') else: self.__age=age #定义个类属性,实现通过直接访问属性的形式去访问私有属性 age=property(get_age,set_age) p1=Person() print(p1.age) p1.age=25 print(p1.age) p1.age=-3 print(p1.age) #法二 class Person(): def __init__(self): self.__age=18 @property#用装饰器修饰,添加属性标志,提供个getter方法 def age(self): return self.__age @age.setter#提供个setter方法 def age(self,parms): if parms<0: print('年龄不能小于0') else: self.__age=parms p1=Person() print(p1.age) p1.age=30 print(p1.age)
四、__new__
(一)单例模式
目的:确保某一类只有一个实例存在
如果希望某个系统中,某个类只能出现一个实例时,那么这个单例对象就满足要求
class DataBassClass: def __new__(cls, *args, **kwargs): #cls._instance=cls.__new__(cls)#不能使用自身的new方法, #容易造成一个深度递归,应该调用父类的new方法 if not hasattr(cls,'_instance'):#如果不存在就开始创建 cls._instance =super().__new__(cls, *args, **kwargs) return cls._instance class DBoptSingle(DataBassClass): pass db1=DataBassClass() print(id(db1)) db2=DataBassClass() print(id(db2)) db3=DataBassClass() print(id(db3)) db1=DBoptSingle() print(id(db1)) db2=DBoptSingle() print(id(db2)) db3=DBoptSingle() print(id(db3))
五、错误与异常处理
(一)异常抛出机制
如果在运行时发生异常,解释器会查找到相应的异常捕获类型
如果在当前函数没有找到的话,他会将异常传递给上层的调用函数,看能否处理
如果在最外层没有找到的话,解释器就会退出,
try: print('我是没有错误产生的') pass except Exception as msg: print(msg) else: print('当Try里面的代码没有出现异常的情况,我才会执行') pass #try-except-finally try: int('34') open('aaa.txt') pass except Exception as msg: print(msg) finally: print('释放文件的资源、数据库连接是资源等等') print('不管有没有出错,都执行')
(二)自定义异常
class ToolongMyException(Exception): def __init__(self,leng): ''' :param leng: 长度 ''' self.leng=leng def __str__(self): return '你输入姓名数据长度是'+str(self.leng)+'超过长度了' def name_Test(): name=input('请输入姓名:') try: if len(name) >= 5: raise ToolongMyException(len(name)) else: print(name) except Exception as msg: print(msg) finally: print('执行完毕了') name_Test()
六、动态添加属性和方法
七、__slots__
限制要添加的实例属性
节约内存空间