#使用私有属性场景:
#1.把特定的属性隐藏起来,不想让类的外部进行直接调用
#2.根据个人需要保护属性
#3.不让使用或让子类继承
class Person:
def __init__(self):
self.__name='李四'#加两个下划线,将此属性私有化
self.age=30
pass
def __str__(self):
return '{}的年龄是{}'.format(self.__name,self.age)
class Student(Person):
pass
stu=Student()
# print(stu.__name)
#AttributeError: 'Person' object has no attribute '__name'
xl=Person()
print(xl)
# print(xl.__name)#外部访问
#AttributeError: 'Person' object has no attribute '__name'
#私有化之后就不能在外部访问,在类内部可以访问
#小结:
#1.私有化的【实例】属性。不能再外部直接访问,可以在类的内部随意使用
#2.子类不能继承父类的私有化属性【只能继承父类公共的属性和行为】
#3.在属性名的前面直接加两个下划线('__')即可属性私有化
#4.私有化属性可以在类的内部进行修改
class student(object):
__slots__ = ('name','age','score')#条件限制,限制要添加的实例属性
def __str__(self):
return '{}.....{}...{}'.format(self.name,self.age,self.score)
pass
xw=student()
xw.name='小王'
xw.age=20
xw.score=99
# print(xw.__dict__)#所有可以用的属性都在这里存储
#占用内存空间大,使用时不能和slot一起用
print(xw)
#在继承关系中应该使用_slots_
#当子类未声明_slots_时,那么子类不会继承父类的_slots_,此时子类可以随意添加属性
class subStudent(student):
pass
ln=subStudent()
ln.gender='男'
ln.pro='计算机信息管理'
print(ln.gender,ln.pro)
import types# 添加方法的库,只有实例方法才需要添加这个库
def dymicMethod(self):
print('{}的体重是{},在{}读大学'.format(self.name,self.weight,Student.school))
pass
@classmethod
def classTest(cls):
print('这是一个类方法')
pass
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
pass
def __str__(self):
return '{}今年{}岁了'.format(self.name,self.age)
print('绑定类方法')
Student.TestMethod=classTest
Student.TestMethod()
zyh=Student('张艳华',20)
zyh.weight=50#动态添加属性
zyh.printInfo=types.MethodType(dymicMethod,zyh)#动态的绑定方法
# print(zyh)
# print(zyh.weight)
print('======================================')
zm=Student('张明',20)
print(zm)
zm.weight=66
zm.printInfo=types.MethodType(dymicMethod,zm)#动态的绑定方法,
zyh.TestMethod()
print('实例对象调用,动态绑定类方法')
# print(zm.weight)
print('====================给类对象添加属性==================')
Student.school='哈工大'
print(zm.school)
print('===================动态添加方法==========================')
zyh.printInfo()#调用动态绑定的方法
zm.printInfo()#调用动态绑定的方法
绑定类方法
这是一个类方法
======================================
张明今年20岁了
这是一个类方法
实例对象调用,动态绑定类方法
====================给类对象添加属性==================
哈工大
===================动态添加方法==========================
张艳华的体重是50,在哈工大读大学
张明的体重是66,在哈工大读大学
class Person(object):
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
# pass
@property #用装饰器修饰,提供一个getter方法
def age(self):
return self.__age
@age.setter
def age(self,parms):
if parms < 0:
print('年龄不能小于0')
else:
self.__age = parms
pass
#定义一个类属性,实现通过直接访问属性的形式去访问私有化属性
# age=property(get_age,set_age)
pass
p1=Person()
print(p1.age)
# p1.get_age()
# p1.set_age()
# class Animal:
# def __int__(self):
# self.color='红色'
# pass
# #在python当中,如果不重写__new___默认结构如下:
# def __new__(cls, *args, **kwargs):
# return super().__new__(cls, *args, **kwargs)
# pass
#
# tigger=Animal#实例化的过程会自动调用__new__去创建实例
#在python3中__new__才是真正的实例化的方法,为类提供外壳制造出实例
#框架,然后调用该框架内的构造方法__int__进行丰满操作
#单例模式:是一种常用的设计模式,确保某一个类只有一个实例存在
class DataBaseClass(object):
def __new__(cls, *args, **kwargs):
# cls._instance=cls.__new__(cls) 容易发生迭代,造成死循环
if not hasattr(cls,'_instance'):#如果不存在就开始创建,这样子内存就一样了,保证单例模式
cls._instance=super().__new__(cls, *args, **kwargs)
return cls._instance
pass
class Dboptsingle(DataBaseClass):
pass
db1=DataBaseClass()
print(id(db1))
db2=DataBaseClass()
print(id(db2))
db3=Dboptsingle()
print(id(db3))
1785255854208
1785255854208
1785255854208
# import Exception
# print(dir(Exception))
# try:
# print(b)#要捕获逻辑的代码
# li=[1,2,3]
# print(li[10])
# # except IndexError as msg:
# # #捕获到的错误在这里执行
# # print(msg)
# # pass
# except Exception as mmm:#捕获所有异常
# print(mmm)
# #在此尽量的去处理捕获异常
#
#
# #如果在运行时发生异常,解释器会查找相应的异常捕获类型
# #如果异常在当前函数没有找到的话,它会将异常传递给上层的调用函数,看能否处理
# #如果在最外层没有找到的话,程序报错
#
# #try-except-else
#
# try:
# print('aa')
# pass
# except Exception as msg:
# print(msg)
# pass
# else:
# print('无错误执行')
# finally:
# print('无论有没有错误,finally的代码一定会执行')
# print('释放文件的资源、数据库连接资源等等')
#自定义异常:都要直接或间接继承Error类或Exception类
class TooLong(Exception):
def __init__(self,leng):
self.len=leng
pass
def __str__(self):
return '您输入的数据长度是'+str(self.len)+'超过长度了'
pass
def name_Test():
name=input('请输入姓名')
try :
if len(name)>5:
raise TooLong(len(name))#抛出异常
else:
print(name)
except TooLong as result:
print(result)
pass
finally:
print('执行完毕')
name_Test()
请输入姓名萨法萨嘎嘎嘎谁
您输入的数据长度是7超过长度了
执行完毕