私有化属性
重要属性防止意外修改,保护属性安全
两个下划线开头定义的属性,声明为私有属性。
不能再类的外部被使用或直接访问,子类不能继承
class Person:
def __init__(self):
self.__name='杨丽宝' # 加两个下划线使属性私有化 只能在类的内部使用
self.age = 18
pass
def __str__(self):
return '{}的年龄是{}'.format(self.__name, self.age)
pass
ylb=Person()
print(ylb.age)
# print(ylb.__name) # 报错
print(ylb)
私有化方法
两个下划线开头定义方法,声明为私有方法。
子类不能继承外部不能调用
末尾双下划线是为了避免属性名与python关键词冲突
Property属性
相当于撬棍,可以撬开私有属性
class Person:
def __init__(self):
self.__age= 18
pass
def get_age(self):
return self.__age
pass
def set_age(self,age):
if age < 0:
print('年龄不能小于0')
else:
self.__age = age
pass
# 定义一个类属性 实现通过直接访问属性的形式去访问私有属性
age=property(get_age,set_age)
pass
p1 = Person()
print(p1.age)
p1.age=25
print(p1.age)
装饰器
推荐使用装饰器
class Person:
def __init__(self):
self.__age= 18
pass
@property
def age(self):
return self.__age
pass
@age.setter
def age(self,age):
if age < 0:
print('年龄不能小于0')
else:
self.__age = age
pass
pass
p1 = Person()
print(p1.age) # 此句调用 @property 下面的方法
p1.age=25 # 此句调用 @age.setter 下面的方法
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
tigger = Animal() # 实例化的过程会自动调用 __new__去创建实例
# 在新类中 __new__ 才是真正的实例化方法 为类提供外壳制造出实例框架
# 然后调用了i中的构造方法 __init__
单例模式
# 一种常见的软件设计模式 目的 :确保一个类只有一个实例存在 例如windows的回收站
# 创建一个单例对象 基于 __new__ 去实现【推荐】
class DataBaseClass(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'): # hasattr() 函数用来判断某个类实例对象是否包含指定名称的属性或方法
cls._instance=super().__new__(cls, *args, **kwargs)
return cls._instance
pass
class DBoptSingle(DataBaseClass):
pass
db1=DataBaseClass()
db2=DataBaseClass()
db3=DBoptSingle
print(id(db1))
print(id(db2))
print(id(db3)) # ????
2830363619040
2830363619040
2830352552496 ?????