面向对象编程(5)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/meiqixiao/article/details/90738752

__new__

  • 当使用“类名([实参])”创建实例对象时,Python解释器的主要处理过程有两大步:
    1.调用特殊方法__new__()创建对象。
    - 首先会查找对象是否实践了书方法__new__(),若没有实践,则去其父类中依次查找,直到哦到类对象object。
    2.调用特殊方法__init__()对你的实例对象进行初始化。
    - __new__()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self。
class Parent(object):
    def __new__(cls, *args, **kwargs):
        pass
    
class Child(Parent):
    def __init__(self, name):
        pass
--------------------------------------------------------------
>>>id(Parent)
2298179254808

>>>id(Child)
2298179238760
----------------------------------------------------------------
class Parent(object):
    def __new__(cls,*args,**kwargs):
        print("父类的__new__()被调用,其形参cls对应实参的id",id(cls))
        obj = super().__new__(cls)
        print("创建的实例对象的id",id(obj))
        return obj
class Child(Parent):
    def __init__(self,name):
         print("子类的__new__()被调用,其形参cls对应实参的id",id(self))
         self.name = name
 -------------------------------------------------------------------------
 >>>print("父类Parent的id:",id(Parent))
 父类Parent的id: 2298179230264

>>>print("子类Child的id:",id(Child))
子类Child的id: 2298179257640

>>>print("创建的实例对象的id:",id(child))
创建的实例对象的id: 2298200306296

__gettitem__(self, key),__setitem__(key),__delitem(self, key)

  • 对于自定义类对象的实例对象,在默认情况下,是不能像列表和字典那样使用中括号来操作数据的。
  • 如果想让自定义类对象的实例对象可以像列表和字典那样,使用中括号来操作数据。必须在自定义类对象中实现以下特殊方法:
    • 1.__gettitem__(self, key)
    • 2.__setitem__(key)
    • 3.__delitem(self, key)
class MyDict(object):
    def __init__(self):
        self.data = {}
        
    def __gettitem__(selg, key):
        return self.data[key]
    
    def __setitem__(self, key, value):
        self.data[key] = value
        
    def __delitem__(self, key):
        self.data[key]
        
md = MyDict()
------------------------------------------------------------
>>>md["one"] = 18
>>>md["two"] = 32
>>>print(md.data)
{'one': 18, 'two': 32}

__call__()

若在类对象个实现了特殊方法__call__(),那么就可以像调用函数一样额调用这个类对象的实例对象,从而会自动调用特殊方法__call__()

class MyClass(object):
    def __call__(self, *args, **kwargs):
        print(args, kwargs)
        
mc = MyClass()
mc()
-------------结果--------------------------------
() {}
-----------------
>>>mc(1, 2, x = 3, y = 4)
(1, 2) {'x': 3, 'y': 4}
  • 内置函数callable用于判断ing对是否可调用的。
  • 除了函数对象是可调用的之外,对于实现了书方法__call__()的类对象,其实例对象也是可调用的。
>>>callable(print)  #内置函数是可调用的
True
def my_fun():    #自定义函数也是可调用的
    pass

>>>print(callable(my_fun))
True
>>>print(callable(MyClass()))  # 实现了特殊方法__call__的类对象,其实例对象也是可调用的
True

__doc____dict__

调用内置函数dir得到的类对象的所有属性中,有一个特殊属性叫__doc__,用于表示类对象的文档字符串。

1.什么是类对象的文档字符串(docstring)
  • 与函数的文档字符串类似,位于类对象的第一行的字符串被称为类对象的文档字符串,通常用三个引号表示。
  • 类对象的是对类对象的功能的简述
2.访问类对象的文档字符串
  • 通过类对象的特殊属性__doc__可以访问类对象的文档字符串。
  • 调用内置函数help()得到的帮助信息中会包含类对象的文档字符串。
  • 对于指定的类对象或实例对象,可以访问特殊属性__dict__获得该类对象或实例对象所绑定的所有属性和方法的字典。其中,字典中的键为属性名或方法名。
class MyClass(object):
     """类对象的文档字符串
     1
     2
     3
     """
     pass
--------------------------------------
>>>print(MyClass.__doc__)
  类对象的文档字符串
     1
     2
     3
class MyClass(object):
    ca = 'ca'
    
    def __init__(self):
        self.ia = "ia"
        
    def im(self):
        pass
    
    @classmethod
    def cm(cls):
        pass
    
    @staticmethod
    def sm():
        pass
-----------------------------------------------
>>>MyClass.ca2 = "ca2"
>>>MyClass.__dict__

mappingproxy({'__module__': '__main__',
              'ca': 'ca',
              '__init__': <function __main__.MyClass.__init__(self)>,
              'im': <function __main__.MyClass.im(self)>,
              'cm': <classmethod at 0x20859f07da0>,
              'sm': <staticmethod at 0x20859f070f0>,
              '__dict__': <attribute '__dict__' of 'MyClass' objects>,
              '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
              '__doc__': None,
              'ca2': 'ca2'})
------------------------------------------------------------------
>>>mc = MyClass()
>>>mc.ia2 = "ia2"
>>>print(mc.__dict__)

{'ia': 'ia', 'ia2': 'ia2'}

猜你喜欢

转载自blog.csdn.net/meiqixiao/article/details/90738752