python当中的魔法方法

1. slots 规定类中可以设置的属性
# 使用__slots__,限制实例当中的属性,不能定义规定之外的属性
class ClassTest():
    __slots__ = ("name","age")
    pass

# classTest01 = ClassTest()
# classTest01.sex = "nan"
# print(classTest01.sex)# AttributeError: 'ClassTest' object has no attribute 'sex'

# 使用__slots__,对于继承的子类无效
class ClassTestSon(ClassTest):
    pass

classTestSon01 = ClassTestSon()
classTestSon01.sex = "nan"
print(classTestSon01.sex)# nan

# 使用__slots__,除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

class ClassTestSon(ClassTest):
    __slots__ = ("sex")
    pass

classTestSon01 = ClassTestSon()
classTestSon01.name = "name"
print(classTestSon01.name)# name
2. str print类的实例是的操作
#__str__ 这个类,用于print打印类时进行返回操作
class ClassTest02():
    def __str__(self):
        return "ClassTest02 to str"

    def __repr__(self):
        return "ClassTest02 to str"

    # 返回用户看到的字符串,而__repr__(),返回程序开发者看到的字符串
    # 所以出现底下这种简易的偷懒的方法
    __repr__=__str__

classTest02 = ClassTest02()
print(classTest02)#ClassTest02 to str
3.__iter__为类写了一个生成器,搭配__next__了()用于for…in…
# 如果一个类想被用于for ... in循环,类似list或tuple那样,
# 就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,
# 直到遇到StopIteration错误时退出循环。
class ClassTest03(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

for i in ClassTest03():
    print(i)
4.__getattr__可以设置未定义变量的默认值
# Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。修改如下:
# __getattr__可以设置未定义变量的默认值
class ClassTest04(object):

    def __init__(self, path=''):
        self._path = path

    def __getattr__(self, path):
        return ClassTest04('%s/%s' % (self._path, path))

    def __str__(self):
        return self._path

    __repr__ = __str__

print(ClassTest04().status.user.timeline.list)
5.__call__在单独调用实例化的对象时实现的方法
class ClassTest05():
    def __init__(self,name):
        self.name = name

    def __call__(self):
        return "ClassTest05{0}".format(self.name)


classTest05 = ClassTest05("__call__")
print(classTest05())
#通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。
print(ClassTest05)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值