python笔记30 私有化属性/方法(封装) 属性函数 __new__ 单例模式

本文详细探讨了Python中的私有属性如何隐藏和保护属性,以及子类继承限制。此外,介绍了单例模式的实现方法,包括基于`__new__`的实例化控制。通过实例演示了如何使用属性装饰器和`property`来访问私有属性,并结合数据库类展示了单例模式的应用。
摘要由CSDN通过智能技术生成

本节主要内容:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述 私有化属性

在这里插入图片描述

使用私有属性的场景
1.把特定的一个属性隐藏起来 不想让类的外部直接调用
2.保护属性 不想让属性的值随意的改变
3.保护属性 不想让派生类[子类]去继承

class Person:
    def __init__(self):
        self.__name='李四'  #公共属性 加两个下划线 将此属性私有化 不可在外部访问 在内部可以访问
        self.age=30
        pass
    def __str__(self):
        '''
        私有化属性在内部是可以访问的
        :return: 
        '''
        return '{}的年龄是{}'.format(self.__name,self.age)
    pass
x1=Person()
print(x1)
# print(x1.__name)  #是在通过类对象 在外部访问的 说明私有化属性不可以在外部直接访问了

在这里插入图片描述

class Person:
    def __init__(self):
        self.__name='李四'  #公共属性 加两个下划线 将此属性私有化 不可在外部访问 在内部可以访问
        self.__age=30
        pass
    def __str__(self):
        '''
        私有化属性在内部是可以访问的
        :return:
        '''
        return '{}的年龄是{}'.format(self.__name,self.age)
    pass

class Student(Person):  #私有属性不可以被继承
    def printInfo(self):
        print(self.__name)  #再次访问父类中的私有属性 可以吗
    pass

stu=Student()
print(stu.__name)

在这里插入图片描述

结论
1.私有化的实例属性 不能在外部直接访问 可以在类的内部随意使用
2.子类 不能继承父类的私有化属性 只能继承父类的公共的属性和行为
3.在属性名前面直接加’__’ 就可以私有化了

class Person:
    __hobby='跳舞' #类属性
    def __init__(self):
        self.__name='李四'  #公共属性 加两个下划线 将此属性私有化 不可在外部访问 在内部可以访问
        self.__age=30
        pass
    def __str__(self):
        '''
        私有化属性在内部是可以访问的
        :return:
        '''
        return '{}的年龄是{}'.format(self.__name,self.age)
    pass

class Student(Person):  #私有属性不可以被继承
    def printInfo(self):
        print(self.__name)  #再次访问父类中的私有属性 可以吗
    pass

stu=Student()
# print(stu.__name)
print(stu.hobby)
print(Person.hobby)

在这里插入图片描述

class Person:
    __hobby='跳舞' #私有类属性
    def __init__(self):
        self.__name='李四'  #公共属性 加两个下划线 将此属性私有化 不可在外部访问 在内部可以访问
        self.__age=30
        pass
    def __str__(self):
        '''
        私有化属性在内部是可以访问的
        :return:
        '''
        return '{}的年龄是{}'.format(self.__name,self.age)
    pass

class Student(Person):  #私有属性不可以被继承
    def printInfo(self):
        print(self.__name)  #再次访问父类中的私有属性 可以吗
    pass

stu=Student()
# print(stu.__name)
# print(stu.__hobby)
print(Person.__hobby)

在这里插入图片描述

class Person:
    __hobby='跳舞' #私有类属性
    def __init__(self):
        self.__name='李四'  #公共属性 加两个下划线 将此属性私有化 不可在外部访问 在内部可以访问
        self.age=30
        pass
    def __str__(self):
        '''
        私有化属性在内部是可以访问的
        :return:
        '''
        return '{}的年龄是{} {}'.format(self.__name,self.age,Person.__hobby)
    pass

class Student(Person):  #私有属性不可以被继承
    def printInfo(self):
        print(self.__name)  #再次访问父类中的私有属性 可以吗
    pass

stu=Student()
print(stu)

在这里插入图片描述

私有属性在内部可以修改

在这里插入图片描述
在这里插入图片描述

私有化方法

在这里插入图片描述

class Animal:
    def eat(self):
        print('吃东西')
        pass
    def run(self):
        print('飞快的跑')
        pass
    pass
class Bird(Animal):
    pass
b1=Bird()
b1.eat()
b1.run()

在这里插入图片描述

class Animal:
    def __eat(self):
        print('吃东西')
        pass
    def run(self):
        print('飞快的跑')
        pass
    pass
class Bird(Animal):
    pass
b1=Bird()
b1.__eat()
b1.run()

在这里插入图片描述

class Animal:
    def __eat(self):
        print('吃东西')
        pass
    def run(self):
        self.__eat()  #在类的内部直接调用
        print('飞快的跑')
        pass
    pass
class Bird(Animal):
    pass
b1=Bird()
# b1.__eat()
b1.run()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Property属性

通过属性的形式来访问已经私有化的属性方法

在这里插入图片描述
在这里插入图片描述

class Person(object):
    def __init__(self):
        self.__age=18
        pass
    # def get_age(self):
    #     return self.__age
    # def set_age(self,age):
    #     if age<0:
    #         print('年龄不能小于0')
    #         pass
    #     else:
    #         self.__age=age
    #         pass
    #     pass
    # # 定义一个类属性 实现通过直接访问属性的形式去访问私有的属性
    # age=property(get_age,set_age)
    # 实现方式2 通过装饰器的方式去声明
    @property #用装饰器修饰,添加属性标志 提供一个getter方法
    def age(self):
        return self.__age
    @age.setter  #提供一个setter方法
    def age(self,parms):
        if parms<0:
             print('年龄不能小于0')
             pass
        else:
            self.__age=parms
            pass
    pass
p1=Person()
print(p1.age)
p1.age=25
print(p1.age)

在这里插入图片描述

__new__方法

在这里插入图片描述
在这里插入图片描述

class Animal:
    def __init__(self):
        self.color='红色'
        pass
    # 在python中 如果不重写 __new__ 默认结构如下
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls,*args,**kwargs)
    pass
tiger=Animal()  #实例化的过程会自动调用 __new__去创建实例
# 在新式类中 __new__才是真正的实例化的方法 为类提供外壳制造出实例框架  然后调用该框架内的构造方法
# __init__进行丰满操作  
# 比喻为建房子 __new__相当于开发地皮 打地基 并将原料存放在工地 而__init__方法负责从工地去材料
# 建造出地皮开发图纸规定的大楼 负责细节设计、建造

单例模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 单例模式  是一种常用的软件设计模式 目的:确保某一个类只有一个实例存在
# 如果希望在整个系统中 某个类只能出现一个实例,那么这个单例对象就能满足要求
# 回收站 资源管理器等都属于单例模式
# 创建一个单例对象 基于__new__去实现【推荐的一种】

class DataBaseClass(object):
    def __new__(cls, *args, **kwargs):
#         不能使用自身的new方法 容易造成一个深度递归,应该调用父类的new方法
        if not hasattr(cls,'_instance'):  ##如果不存在就开始创建
            cls._instance=super().__new__(cls,*args,**kwargs)
        return cls._instance
    pass
class DBoptSingle(DataBaseClass):
    pass



db1=DBoptSingle()   #每个对象都是一个新的对象
print(id(db1))
db2=DBoptSingle()
print(id(db2))
db3=DBoptSingle()
print(id(db3))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值