组合、内置方法和反射

一、组合

    什么叫组合

      一个对象拥有一个属性,该属性的值是另一个对象。

 

    组合有什么用

      解决类与类之间代码冗余问题

      便于代码统一维护

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


class Course():
    def __init__(self, name, price, period):
        self.name = name
        self.price = price
        self.period = period


python = Course('python', 20000, '6mon')
linux = Course('linux', 20000, '5mon')


class Student(People):
    def __init__(self, name, age, gender, course=None):
        if course is None:
            course = []
        self.courses = course
        super().__init__(name, age, gender)

    def chose_course(self, course):
        self.courses.append(course)


stu1 = Student('xk', 18, 'male')

stu1.courses.append(python)  # 对象python当作值赋给对象stu1的属性courses

  

 

二、内置方法

    什么是是内置方法

      定义在类内部,以__开头并__结尾的方法

      特点:会在某种情况下自动触发

    为何需要内置方法

      为了定制类或者对象

    如何使用内置方法

      __str__在print打印时触发,会将返回值(必须时字符串)当作本次打印的结果

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

    def __str__(self):
        return 'name:%s,age:%s' % (self.name, self.age)


stu1 = Student('kk', 18)
print(stu1)  # name:18,age:kk

      __del__ 在清理对象时触发,或者程序运行完后会先执行该方法

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

    def __del__(self):
        print(1111)


stu1 = Student('kk', 18)
print(22222)

 

 

 

 

    __enter__ 在使用 with语句时触发

    __exit__ with语句结束时触发

class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
        # return self
        return 123

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')


with Open('a.txt') as f:
    print('=====>执行代码块')
    print(f)

    

    __call__  在对象加()时触发

class Foo:

    def __call__(self, *args, **kwargs):
        print('__call__')


s = Foo()
s()

 

 

      

三、反射

    什么是反射

      对象通过字符串操作属性的过程称为反射

      主要涉及到以下四个方法

 

      getattr() 利用字符串查找对象里的属性是否存在

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


stu1 = Student('k', 18, 'male')

print(getattr(stu1, 'name', None))  # k
print(getattr(stu1, 'name1', None))  # None

      如果存在,则会返回该属性的值,不存在则会返回getattr里的第三个参数

      

      setattr()利用字符串设置对象里的属性

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


stu1 = Student('k', 18, 'male')



setattr(stu1, 'name', 'kk')
print(getattr(stu1, 'name'))  # kk

      

      hasatt()利用字符串判断对象里的属性是否存在,存在返回True,不存在返回False

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


stu1 = Student('k', 18, 'male')



print(hasattr(stu1, 'name'))  # True
print(hasattr(stu1, 'name1'))  # False

  

      delattr()利用字符串删除对象里的属性

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


stu1 = Student('k', 18, 'male')



delattr(stu1,'name')
print(stu1.__dict__)  # {'age': 18, 'gender': 'male'}

 

posted @ 2021-12-07 19:30  椰子皮0oo0  阅读(37)  评论(0)    收藏  举报
1