组合,反射,内置方法

一、组合

1.类的组合:

在一个类中以另外一个类的对象作为数据属性

2.组合与继承的区别?

继承是一种“是”的关系,比如老师是人、学生是人,当类之间有很多相同的之处,应该使用继承;而组合则是一种“有”的关系,比如老师有生日,老师有多门课程,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,应该使用组合

class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day


class Teacher:
    def __init__(self, name, age, year, month, day):
        self.name = name
        self.age = age
        self.birth = Date(year, month, day)


stu = Teacher('小明', 24, 1990, 12, 8)
print(stu.birth)

二、反射

1.反射的概念

反射机制是指的是在程序的运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意方法和属性。这种动态获取程序信息以及动态调用对象的功能称为反射机制。

2.如何实现反射?

在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式。

3.如何通过字符串操作对象的属性?

使用内置函数hasattr()、getattr()、setattr()、delattr()

<1> hasattr(对象,属性) 判断对象是否含有某个属性,该属性是类中的属性名,不是赋值

class A:
    def __init__(self, name, age):
        self.name = name


stu = A('lili')
print(hasattr(stu, 'lili'))  # False
print(hasattr(stu, 'name'))  # True

<2> getattr(对象,属性,属性不存在时的返回值)

class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age


stu = A('lili', 13)
print(getattr(stu, 'name', 'name不存在时的返回值'))  # lili
print(getattr(stu, '属性', '属性不存在时的返回值'))  #属性不存在时的返回值

<3> setattr(对象,属性,属性值)为对象内中增加新的值

class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age


stu = A('lili', 13)
print(stu.__dict__)  # {'name': 'lili', 'age': 13}
setattr(stu, 'part ', '小明')
setattr(stu, 'level', 14)
print(stu.__dict__)  
# {'name': 'lili', 'age': 13, 'part ': '小明', 'level': 14}

<4> delattr(对象,属性名)存在则删除,不存在报错

class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age


stu = A('lili', 13)
print(stu.__dict__)  # {'name': 'lili', 'age': 13}
delattr(stu, 'name')
print(stu.__dict__)  # {'age': 13}
print(stu.'name')    # 不存在即报错

三、内置方法


1.概念:

Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类,这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发。

2.常用的内置方法

__init__()
__str__()
__del__()
__enter__()
__exit__()
__call__()
posted @ 2021-12-07 19:14  recordlife  阅读(38)  评论(0编辑  收藏  举报