面向对象(三)

#使用私有属性场景:
#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)

 

小王.....20...99
男 计算机信息管理

 

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()

 

18

 

# 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超过长度了
执行完毕

  

 

 

 

posted @ 2022-07-26 19:56  只愿为你  阅读(66)  评论(0)    收藏  举报