本节主要内容:
私有化属性
使用私有属性的场景
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))