两个系统内置方法:isinstance、issubclass
class A(object):
pass
class B(A):
pass
a = A()
print(isinstance(a, A)) # True a是否是A的实例化对象
print(issubclass(B, A)) # True B是否是A的子类
双下划线方法:
__str__和__repr__:
object里有__str__,一旦被调用就返回对象的内存地址,如果类里面没有__str__,则str(obj)时调用object对象的__str__
如果类只有__repr__,则调用str(obj)等时会调用__repr__
__repr__是__str__的备用函数
class A:
pass
class B:
def __str__(self):
return '__str__ in B'
def __repr__(self):
return '__repr__ in B'
a = A()
print(a) # <__main__.A object at 0x00000180DD59B0F0>
print(str(a)) # <__main__.A object at 0x00000180DD59B0F0>
print(repr(a)) # <__main__.A object at 0x00000180DD59B0F0>
print('%s:%s' %('A',a)) # A:<__main__.A object at 0x00000180DD59B0F0>
print('%s:%r' %('A',a)) # A:<__main__.A object at 0x00000180DD59B0F0>
b = B()
print(b) # __str__ in B
print(str(b)) # __str__ in B
print(repr(b)) # __repr__ in B
print('%s:%s' %('B',b)) # B:__str__ in B
print('%s:%r' %('B',b)) # B:__repr__ in B
=======================================================================
class A:
pass
class B:
def __repr__(self):
return '__repr__ in B'
a = A()
print(a) # <__main__.A object at 0x00000180DD59B0F0>
print(str(a)) # <__main__.A object at 0x00000180DD59B0F0>
print(repr(a)) # <__main__.A object at 0x00000180DD59B0F0>
print('%s:%s' %('A',a)) # A:<__main__.A object at 0x00000180DD59B0F0>
print('%s:%r' %('A',a)) # A:<__main__.A object at 0x00000180DD59B0F0>
b = B()
print(b) # __repr__ in B
print(str(b)) # __repr__ in B
print(repr(b)) # __repr__ in B
print('%s:%s' %('B',b)) # B:__repr__ in B
print('%s:%r' %('B',b)) # B:__repr__ in B
不是所有内置方法都对应在类中双下划线方法,如len
__del__:析构函数,先执行本类自定义__del__,在执行del操作
class A:
def __del__(self):
print('del in A')
a = A()
del a
print(a) # del in A NameError: name 'a' is not defined
如果不执行del,垃圾回收机制生效时也会先执行本类__del__,再执行del
class A:
def __del__(self):
print('del in A')
a = A()
print('ok') # ok del in A
析构函数用于在释放对象前进行收尾工作,如文件操作:
class A:
def __del__(self):
print('close file')
self.f.close()
a = A()
a.f = open('test.py', 'r')
del a # close file
__call__:对象被调用时执行,obj()
class A:
def __call__(self, name):
print(name)
a = A()('test') # test
__new__:构造方法,(__init__是初始化方法不是构造方法)
执行顺序:__new__ -> __init__
如果自定义了__new__构造方法,必须返回object.__new__才会构造self,才会触发init方法
class A:
def __init__(self):
print('init')
def __new__(cls):
print('new')
return object.__new__(cls)
a = A() # new init
====================================
class A:
def __init__(self):
print('init')
def __new__(cls):
print('new')
a = A() # new
构造方法应用:单例模式(初级,多线程时有问题)
在python3中object.__new__(cls, *args, **kwargs)会报错object() takes no parameters
class A:
__instance = None
def __init__(self, name, age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if cls.__instance:
return cls.__instance
cls.__instance = object.__new__(cls)
return cls.__instance
a1 = A('a1', '12')
a2 = A('a2', '13')
print(a1) # <__main__.A object at 0x0000026BADDD27B8>
print(a2) # <__main__.A object at 0x0000026BADDD27B8>
print(a1.name, a1.age) # a2 13
print(a2.name, a2.age) # a2 13
__eq__:判断对象是否相等时调用
class A(object):
"""docstring for A"""
def __init__(self, name):
super(A, self).__init__()
self.name = name
a1 = A('a1')
a2 = A('a2')
print(a1) # <__main__.A object at 0x00000265BFA0BCF8>
print(a2) # <__main__.A object at 0x00000265BFA0BD30>
print(a1 == a2) # False
print(a1 is a2) # False
======================================================
class A(object):
"""docstring for A"""
def __init__(self, name):
super(A, self).__init__()
self.name = name
def __eq__(self, other):
return self.name == other.name
a1 = A('a1')
a2 = A('a1')
print(a1) # <__main__.A object at 0x00000265BFA0BCF8>
print(a2) # <__main__.A object at 0x00000265BFA0BD30>
print(a1 == a2) # True
print(a1 is a2) # False
哈希:对象的哈希是默认根据内存地址哈希的
class A(object):
"""docstring for A"""
def __init__(self, name):
super(A, self).__init__()
self.name = name
a1 = A('a1')
a2 = A('a1')
print(a1) # <__main__.A object at 0x00000265BFA0BCF8>
print(a2) # <__main__.A object at 0x00000265BFA0BD30>
print(hash(a1)) # -9223371933239358513
print(hash(a2)) # 103615417299
=====================================================
class A(object):
"""docstring for A"""
def __init__(self, name):
super(A, self).__init__()
self.name = name
def __hash__(self):
return hash(self.name)
a1 = A('a1')
a2 = A('a1')
print(a1) # <__main__.A object at 0x00000265BFA0BCF8>
print(a2) # <__main__.A object at 0x00000265BFA0BD30>
print(hash(a1)) # 103615417299
print(hash(a2)) # 103615417299