10.10 知识总结(组合、反射、魔术方法等)

一、 组合

      1.1 什么是组合?

组合就是,一个对象拥有一个属性,该属性的值是另外一个对象.

class Foo:
    def __init__(self, m):
        self.m = m

class Bar():
    def __init__(self, n):
        self.n = n

注:一个对象拥有一个属性,该属性的值是另外一个对象

   1.2  什么场景下使用继承? 什么场景下使用组合?

 继承一般情况用在:什么是什么的情况 is
 组合一般用在:什么有什么的情况 has 

二、反射

         2.1 什么是反射

在Python中,反射指的是通过字符串来操作对象的属性,涉及到四个内置函数的使用(Python中一切皆对象,类和对象都可以用下述四个方法)

      2.2  四个内置函数

    getattr: 获取属性 ##### 用的最多
    setattr:设置属性
    hasattr:判断是否有某个属性
    delattr:删除

     反射:就是通过字符串的形式来操作对象的属性

class Student():
    school = 'SH'

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

    def func(self):
        print('from func')

    def index(self):
        print('from index')
stu = Student('kevin', 20)
# attr=input('请输入你要操作的属性名:')
# print(stu.school)
# print(stu."school")

 当你查询的属性不存在的时候,如果给了第三个参数,就返回第三个参数

 res=getattr(stu, 'school1', 666) 

如果你给了第三个参数,查询的属性也存在,那就直接返回属性对应的值,默认值就没用了

# res=getattr(stu, 'school', 666) # SH 666
# res1=getattr(stu, 'name') # SH
# res2=getattr(stu, 'age') # SH
# print(res,res1, res2)
# print(stu.school)
# print(res)

   2.3  函数的用法(必须掌握)

        1. getattr
res=getattr(stu, 'func1', stu.index) #### 用的是最多的
print(res) <bound method Student.func of <__main__.Student object at 0x000001963F5C5A60>>
res()
    2.  setattr(设置)
 setattr(stu, 'x', 666) # stu.x=666
 print(stu.__dict__)

  3. hasattr

print(hasattr(stu, 'func'))
if hasattr(stu, 'func'):
    getattr(stu, 'func')()
else:
    ...

4.  delattr

 delattr(stu, 'name')
 del stu.name
 print(stu.__dict__)

 import time
 time=__import__('time') # import time
 print(time.time())

random=__import__('random')
print(random.randint(0,8))

三、 内置方法之魔术方式(重要)

它的特点就是双下划线开头的方法,它满足一定的条件就会自动触发,简称魔法。

      3.1 有哪些魔术方法

  1. __init__
  2. __str__,__repr__

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


    """
        1. 打印对象的时候,输出对象的时候会自动触发类中得__str__方法
        2. 返回值必须是字符串形式
        3. 如果它跟__repr__方法同时存在,__str__的优先级更高
    """

  3.__del__

    """
    1.当你删除对象的时候会触发__del__的执行
    2. 当整个脚本的程序都执行完毕的时候,也会触发__del__的执行
    3. 一般用在用来在对象被删除时自动触发回收系统资源的操作
    """

 def __del__(self):
        print('from _del')
        self.f.close()

4. __enter__和 __exit__

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

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

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

 注:with它可以用在很多地方,但是,出现with语句后面的对象中得类必须要声明__enter__和__exit__

5. setitem,getitem,delitem__

__setitem__,__getitem,__delitem__

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

    """当你通过中括号获取对象的属性的时候,会自动触发__getitem__"""
    def __getitem__(self, item):
        print('__getitem__')
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        # key:age
        # value:18
        print('__setitem__')
        self.__dict__[key] = value
        #  self.__dict__['age'] = 18

    def __delitem__(self, key):
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)
        pass

    # def __delattr__(self, item):
    #     print('del obj.key时,我执行')
    #     self.__dict__.pop(item)
obj=Foo('tom')
# print(obj.name)

# obj['name']
obj['age'] = 18
# obj.age=18
print(obj.age)

del obj['age']

 6. __call__

class Foo:

    def __init__(self):
        pass
    #### 当对象加括号的时候会触发__call__的执行
    def __call__(self, *args, **kwargs):
        print('__call__')


obj=Foo()
print(obj)
obj()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值