python中的双下滑线方法

len(a) len(对象) 如果此类中有__len__ 就_方法会自动执行__len__
# len(a) len(对象) 如果此类中有__len__ 就_方法会自动执行__len__

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

    def __len__(self):
        # print(666)
        return len(self.__dict__)


a = A('barry', 18)
print(len(a))

__call__方法 对象() 触发 __call__方法使得对象具备当作函数来调用的能力
class Foo:

    def __init__(self):
        print(11)

    def __call__(self, *args, **kwargs):
        print(65656)
        pass


obj = Foo()
obj()  # 对象() 触发 __call__方法

class PenFactory:
    def __init__(self, p_type):
        self.p_type = p_type

    def __call__(self, p_color):
        print('创建一个%s这个类型的画笔,它的颜色是%s' % (self.p_type, p_color))


# gangbiF = PenFactory('钢笔')
# gangbiF('红色')
# gangbiF('蓝色')
# gangbiF('黑色')

qianbiF = PenFactory('铅笔')
qianbiF('红色')
qianbiF('蓝色')
qianbiF('黑色')

__new__ 构造方法
1, 类名() 执行object.__new__方法,开辟的对象空间并返回
2,自动执行__init__方法,将空间创给self
3,在__init__给对象封装属性。
应用场景举例单例模式https://www.cnblogs.com/chen55555/p/10289777.html
class A:
    def __init__(self,name):
        self.name = name
        print('in A __init__')

    def __new__(cls, *args, **kwargs):
        print('in A __new__')
        return object.__new__(cls)


a = A('rock')
print(a.name)
item系列将对象视为字典使用时,就会触发item方法
# item系列将对象视为字典使用时,就会触发item方法
class Foo:
    def __init__(self,name):
        self.name = name

    def __getitem__(self, item):
        # print(666)
        print('obj[key]把对象当字典用时执行')
        return self.name
        # print(self.__dict__[item])

    def __setitem__(self, key, value):
        # print(key)
        # print(value)
        print('obj[key] = value设置字典的键值时执行')
        self.__dict__[key] = value

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


f1 = Foo('sb')
ret = f1['name']
print(ret)
f1['age'] = 12
print(f1.__dict__)
print(f1.age)


f1['age'] = 18
f1['age1'] = 19
del f1.age1
del f1['age']
f1['name'] = 'alex'
print(f1.__dict__)

__str__ print(obj)是调用__str__方法
可以格式化打印对象中的信息
class Penson:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return '这个人的姓名是%s,年龄是%s' % (self.name, self.age)


p1 = Penson('rock', 18)
print(p1, type(p1))

p2 = Penson('张三', 20)
print(p2)

s = str(p1)
print(s, type(s))

__repr__

当实现了__str__方法可用repr来获取函数地址
当没有实现了__str__方法则执行类中的__repr__
class Penson:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return '这个人的姓名是%s,年龄是%s' % (self.name, self.age)

    def __repr__(self):
        return 'repr'


p1 = Penson('rock', 18)
print(p1, type(p1))

p2 = Penson('张三', 20)
print(p2)

# s = str(p1)
# print(s, type(s))

# 当实现了__str__方法可用repr来获取函数地址
# 当没有实现了__str__方法则执行类中的__repr__
print(repr(p1))

 



posted @ 2019-01-20 16:13  平平无奇小辣鸡  阅读(277)  评论(0)    收藏  举报