2021年12月13日

2021/12/13 23:48:38

本文主要是介绍2021年12月13日,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、属性私有化

(一)使用私有属性场景:

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__

限制要添加的实例属性

节约内存空间



这篇关于2021年12月13日的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程