自学Python--类内置方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41402059/article/details/82695361

两个系统内置方法: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

猜你喜欢

转载自blog.csdn.net/weixin_41402059/article/details/82695361