内置方法

1,__len__方法

class A:
    def __init__(self,name,age,sex,cls):
        self.name = name
        self.age = age
        self.sex = sex
        self.cls = cls
    def __len__(self):
        return len(self.__dict__)
    
a=A("张三","",18,6)
print(len(a))
View Code

2,__hash__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __hash__(self):
        return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
View Code

3,__call__       对象名() 相当于调用类内置的__call__, 一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__

class Teacher():
    def __call__(self):
        print(123)
t = Teacher()
t() 
View Code

4,__eq__        == 是由__eq__的返回值来决定的

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __eq__(self,obj):
        if  self.a == obj.a and self.b == obj.b:
            return True
a = A()
b = A()
print(a == b)
View Code

5,__del__       析构方法,当对象在内存中被释放时,自动触发执行,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:

    def __del__(self):
        print('执行我啦')

f1=Foo()
del f1
print('------->')

#输出结果
执行我啦
------->
View Code

6,__new__     构造方法,该方法会创造一个对象,默认传一个类(cls)参数,执行完构造方法后,再执行__init__

单例模式:即一个类只能有一个实例

class B:
    __instance = None
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            obj = object.__new__(cls)
            cls.__instance = obj
        return cls.__instance
    def __init__(self,name,age):
        self.name = name
        self.age = age
a = B('ads',18)
b = B('egon',20)
print(a)
print(b)
#打印的都是同一个内存地址
print(a.name)
print(b.name)
单例模式

7,__getitem__      __setitem__     __delitem__

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

    def __getitem__(self,item):
        return  self.__dict__[item]

    def __setitem__(self, key, value):
        self.__dict__[key]=value

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

f = Foo('alex')
# f.name = ...
print(f['name'])     # f.__getitem__('name')
f['age']  = 18      # 赋值
print(f.age)        # 自带的语法
print(f['age'])
f['age']  = 80        # 修改
print(f['age'])      # 通过实现__getitem__得到的
del f['age']        # 删除
View Code

8,__str__

print(obj) 的结果 是 obj.__str__()的结果,print替你将数据类型转化成字符串打印出来。

str(obj) 的结果 也是 obj.__str__()的结果。

'%s' %obj 的结果 也是 obj.__str__()的结果。

class List:
    def __init__(self,*args):
        self.l = list(args)
    def __str__(self):
        return '[%s]'%(','.join([str(i) for i in self.l]))
l1 = List(1,2,3,4,5)
print(l1)        #--> l1.__str__()
#print替你将数据类型转化成字符串打印出来
print(str(l1))
print('%s'%l1)
#以上三种方式打印的内容相同
View Code

9,__repr__

repr(obj) 的结果和obj.__repr__()是一样的

'%r' %(obj)的结果和obj.__repr__()是一样的

class Teacher:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return "Teacher's object %s"%self.name
    def __repr__(self):
        return 'repr function %s'%self.name
a = Teacher('alex',80)
b = Teacher('egon',80)
print(a)
print(b)
print(repr(a))   # 相当于print(a.__repr__())
print('%r'%a)
print(str(a))   # 打印str函数的返回值
View Code

10,,__str__ 和__repr__的区别

当需要使用__str__的场景时找不到 __str__就找__repr__

当需要使用__repr__的场景时找不到__repr__的时候就找父类的repr

11,__format__

class A:
    def __init__(self,name,school,addr):
        self.name = name
        self.school = school
        self.addr = addr
    def __format__(self,format_spec):
        return format_spec.format(obj=self)

a = A('大表哥','oldboy','沙河')
format_spec = '{obj.name}-{obj.addr}-{obj.school}'
print(format(a,format_spec))
View Code

 

posted @ 2018-04-20 16:47  扬帆起航111  阅读(118)  评论(0编辑  收藏  举报