反射等一系列内置函数

hasattr(obj,"name")

getattr(obj,"name",default = xx)

setattr(obj,"name", '')

delattr(obj,'name')

在文件中用反射

def sa_hi():
    print('Nihao a')

isinstance(obj,cls)  #判断一个对象是否是一个类的对象,也可以判断是否是父类的,反应族谱关系
x = 111
print(isinstance(x,int)) #xint的实例化,判断x是否是int的对象

issubclass(sub,super) 判断sub是否是super的子类

class Foo():
    pass

class Fpp(Foo):
    pass

print(issubclass(Fpp,Foo))

__getattribute__ 是大哥,__getattr__是小弟
raise AttributeError 是抛出异常

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

    def __getattr__(self, item):
        print("this is getattr")

    def __getattribute__(self, item):
        print('this is get attribute')
        raise AttributeError("快去叫attr")


f1 = Foo('yishu')

f1.name
f1.xxxx

item系列

class Foo():
    def __getitem__(self, item):
        print('getitem')
        # return

    def __setitem__(self, key, value):
        self.__dict__[key] = value
        print('setitem')
    def __delitem__(self, key):
        self.__dict__.pop(key)
        print('deleitem')

f1 = Foo()
f1['name'] = 'yishu'
print(f1.__dict__)  #{'name': 'yishu'}

del f1.name
print(f1.__dict__)
setitem
{'name': 'yishu'}
{}
.的方式操作属性,就是和attr打交道,中括号和item相关。

class Foo:
    def __str__(self):  #控制打印信息
        return 'str'
    pass
f1 = Foo()
print(f1)
print(f1)  ----print触发str(f1) --->f1.__str__()

def __repr__ 在解释器中触发
class Foo():
    def __repr__(self):
        return 'fsagfs'
    pass


f1 = Foo()
print(f1)  #fsagfs
print调的本质是f1.__str__,如果找不到str,就回去找repr作为替代品

class Foo():
    def __str__(self):
        return 'gao'  #必须return字符串
    def __repr__(self):
        return 'fsagfs' #必须return字符串
    pass


f1 = Foo()
print(f1)  #return 'gao'优先执行__str__

自定制format格式
复习 format
x = '{0} {0} {0}'.format('yishu')
print(x)  #yishu yishu yishu

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

d1 = Date(2018,4,12)
x = '{0.day}:{0.month}:{0.year}'.format(d1)
print(x)   #12:4:2018

class PrinDate:
    def __init__(self,year,mon,day):
        self.year = year
        self.mon = mon
        self.day = day


    def __format__(self, format_spec):
        format_dict = {
            'ymd': '{0.year}/{0.mon}/{0.day}',
            'y:m:d' : '{0.year}:{0.mon}:{0.day}'
        }

        if not format_spec or format_spec not in format_dict:
            format_spec = 'ymd'

        return format_dict[format_spec].format(self)

d1 = PrinDate(2018,4,12)
print(d1)

print(format(d1,'fsdf'))

----------------------__slots__---------------------

class Foo():
    __slots__ = ['name','age']

f1 = Foo()
f1.name = 'yishu'
f1.age = '26'
print(f1.name)

--------------------__module__,__class__---------------
查看某个实例由哪个模块产生,由哪个类产生

---------------------__del__-----------------------------
析构方法,当对象在内存中被释放时,自动触发执行。就是删除整个实例时执行。

class Foo:

    def __del__(self):
        print("chanshuneicun")

f1 = Foo()  #实例化之后,文件执行完毕,释放内存,进行垃圾回收,触发。所以需要先存到变量中。
------------------—__call__------------------

class Foo:
    def __call__(self, *args, **kwargs):
        print("zhixng")

f1 = Foo()
f1()
#类后面的括号实质上是运行上一级类的__call__方法
#f1实例是类Foo产生,但是原本Foo没有call方法,可以添加。
#那么,Foo也是一个实例,它的类有call方法,所以可以在后面加上括号。
-------------------__next____iter__--------------------------
我们知道for循环是调用了数组列表等内部的__iter__,把他们变成了可迭代对象之后,再调用__next__函数。
那么,如何自己构造一个迭代器呢?
class Foo:
    def __init__(self,n):
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        self.n += 1
        if self.n == 100:
            raise StopIteration
        return self.n

f1 = Foo(90)
for i in f1:  #本质上就是执行__next__
    print(i)
------------------------fibarray--------------------

class Fib():
    def __init__(self):
        self._a= 1
        self._b = 1

    def __iter__(self):
        return self

    def __next__(self):
        self._a, self._b = self._b,self._a + self._b
        if self._a >100:
            raise StopIteration
            print('zz')
        return self._a

f1 = Fib()
print(f1.__next__())
print(f1.__next__())
for i in f1:
    print(i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值