zoukankan      html  css  js  c++  java
  • 14 类的常用魔术方法举例

    __init__()

    class Fish(object):
        def __init__(self, name):
            self.name = name
            print("My name is: %s" % self.name)
    
    
    f = Fish("fish_9527")
    

    >>>

    My name is: fish_9527
    

    __new__()

    例1

    class Fish(object):
        def __new__(cls, *args, **kwargs):
            print("创建对象时,new 方法会被自动调用,然后分配空间")
    
        def __init__(self):
            print("Fish 类初始化")
    
    
    f = Fish()
    

    >>>

    创建对象时,new 方法会被自动调用,然后分配空间
    

    例2

    class Fish(object):
        def __new__(cls, *args, **kwargs):
            print("创建对象时,new 方法会被自动调用")
            return super().__new__(cls)  # 为对象分配空间,并返回对象的引用
    
        def __init__(self):
            print("Fish 类初始化")
    
    
    f = Fish()
    print(f)
    

    >>>

    创建对象时,new 方法会被自动调用
    Fish 类初始化
    <__main__.Fish object at 0x000002769064EF28>
    

    例3 单例模式1

    class Fish(object):
        # 记录第一个被创建对象的引用
        instance = None
        
        def __new__(cls, *args, **kwargs):
            # 判断类属性是否是空对象
            if cls.instance is None:
                # 调用父类的方法,为第一个对象分配空间
                cls.instance = super().__new__(cls)
            # 返回类属性保存的对象的引用
            return cls.instance
    
    
    f1 = Fish()
    print(f1)
    
    f2 = Fish()
    print(f2)
    

    >>>

    <__main__.Fish object at 0x000002769065B048>
    <__main__.Fish object at 0x000002769065B048>
    

    例4 单例模式2

    • 让初始化的动作只执行一次
    class Fish(object):
        # 记录第一个被创建对象的引用
        instance = None
        init_flag = False
        
        def __new__(cls, *args, **kwargs):
            # 判断类属性是否是空对象
            if cls.instance is None:
                # 调用父类的方法,为第一个对象分配空间
                cls.instance = super().__new__(cls)
            # 返回类属性保存的对象的引用
            return cls.instance
    
        def __init__(self):
            # 判断是否执行过初始化动作
            if Fish.init_flag:
                return
            # 若没执行过,则执行初始化动作
            print("Fish 类初始化")
            # 修改类属性的标记
            Fish.init_flag = True
    
    
    f1 = Fish()
    print(f1)
    
    f2 = Fish()
    print(f2)
    

    >>>

    Fish 类初始化
    <__main__.Fish object at 0x00000276906632E8>
    <__main__.Fish object at 0x00000276906632E8>
    

    __call__()

    >>> class A(object):
    ...     def __call__(self):
    ...         print("this is __call__")
    ...
    >>> a = A()
    >>> a
    <__main__.A object at 0x000001DFDF94E5C0>
    >>> print(a)
    <__main__.A object at 0x000001DFDF94E5C0>
    >>> 
    

    __str__()

    >>> class A(object):
    ...     def __str__(self):
    ...         return "this is __str__"
    ...
    >>> a = A()
    >>> a
    <__main__.A object at 0x000001DFDF94EA58>
    >>> print(a)
    this is __str__
    >>> 
    

    __repr__()

    例1

    >>> class A(object):
    ...     def __repr__(self):
    ...         return "this is __repr__"
    ...
    >>> a = A()
    >>> a
    this is __repr__
    >>> print(a)
    this is __repr__
    >>> 
    

    例2

    >>> class A(object):
    ...     def __str__(self):
    ...         return "this is __str__"
    ...     def __repr__(self):
    ...         return "this is __repr__"
    ...
    >>> a = A()
    >>> a
    this is __repr__
    >>> print(a)
    this is __str__
    >>> 
    
  • 相关阅读:
    P5858
    P1171
    树莓派显示CPU温度
    Docker容器文件系统位置
    Python返回列表中距离最小的点
    【实用】ubuntu和python快速换源
    shell下实现echo彩色输出
    mysql查询主表有数据,副表0条数据的列表
    swagger加请求头带token
    Error running $classname: Command line is too long. Shorten command line for $classname
  • 原文地址:https://www.cnblogs.com/yorkyu/p/10693134.html
Copyright © 2011-2022 走看看