zoukankan      html  css  js  c++  java
  • python面向对象的特殊方法和单例模式

    主要内容:

    1.特殊方法

    2.设计模式:单例模式

    1.特殊方法

    isinstance  判断obj1是否是B这个类实例化来的,或者是B这个类的父类实例化来的.是的话,返回true,不是返回False

    isinstance(obj1,B)

    issubclass 判断一个类是否是另一个类的派生类.

    print(issubclass(B,A))  如果B类是A类派生来的话,那么就是Ture.

    __len__, __hash__ __str__ __repr__

    len(a1  )如果对一个对象进行len()操作,  他会找到对象从属于的类中的__len__方法,并且此方法中必须要有数字的返回值.

    __hash__方法也有类似的效果.

    示例:

    class A:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __len__(self):
            return len(self.__dict__)
    
    a1 = A('oldboy',1000)
    print(len(a1))

    __str__方法

    # print(a) # 打印对象,就会触发类中__str__方法
    # str(a) # str(a),就会触发类中__str__方法
    # print('打印此类对象:%s' % a) # 格式化输出 '%s'a

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
        def __str__(self):
            return "666"
    a1 = A("leon",18)
    print(str(a1))
    print("%s----->"%a1)

    repr也是类似的方法

    __call__ 方法

    对象() 自动执行类中的__call__方法

    示例:

    class A:
        def __init__(self):
            pass
        def func(self):
            print(111)
    
        def __call__(self, *args, **kwargs):
            '''各种代码'''
            # print(666)
            print(args)
            return 'wusir'
    a1 = A()
    print(a1(1,2,3))
    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
            self.sex =args[2]
        def __call__(self, *args, **kwargs):
            print(666)
    a1 = A("leon",18,"")
    a1()

     __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
    a1 = A()
    b1 = A()
    print(a1 == b1)

    __del__    析构方法

    python垃圾回收机制
    文件中你创建的所有的变量,类等等.执行完毕之后,
     一段时间内如果没有用到, 他会自动在内存中去除.
     深入研究: 他会将你的所有变量,类等等做个标记,在一段时间之内,没有被调用,则就会自动回收.

    class A:
        def __init__(self):
            pass
        def __del__(self):
            print(666)
    a1 = A()
    class A:
        def __del__(self):
            print(666)
    a1 = A()

    __new__   object产生并返回一个对象空间.

    当初始化对象时,比如a1 = A(),当类名加()时,首先执行的是A类中的__new__方法,如果没有就去父类中去读取,父类没有就去object中读取,object中是有这个方法的,object的__new__方法是需要传入类的,__new__会默认传入调用的类.并返回一个对象空间.

    示例:

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
        def fun(self):
            pass
        def __new__(cls, *args, **kwargs):
            print(666)
    
    a1 = A("name",18)
    a1.name
    
    
    """
    这个示例跑的话会报错,因为__new__在类中有,而且这个类并不会返回一个对象空间,按下面改就可以了.
    """
    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
        def fun(self):
            pass
        def __new__(cls, *args, **kwargs):
            print(666)
            return object.__new__(cls)
    
    a1 = A("name",18)
    p = a1.name
    print(p)

    具体实例化对象的过程 是

    '''
    1,类名() 执行 __new__方法,先从自己的类中寻找,
    如果没有找到,则从父类(直到object类)寻找,然后从object的__new__产生一个对象空间,返回给类名().
    2,对象空间一旦产生并返回.则自动执行__init__方法,给这个对象空间封装属性.
    3,最终你得到是封装好属性的对象空间.

    '''

    单例模式:对一个类只能实例化一个对象.重要,相当重要

    python实现单例方式如下:

    class A:
        __instance = None
        def __new__(cls, *args, **kwargs):
            if A.__instance is None:
                A.__instance = object.__new__(cls)
            return A.__instance
    a1 = A()
    a2 =A()
    a3 = A()
    print(a1,a2,a3)

    __item__   类中的的item方法

    当一个对象,比如a1 对象,参考字典方法调用时,a1["name"],这时就会触发item方法的,

    详细示例如下:

    __getitem__(self,item)

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
            self.sex = args[2]
        def __getitem__(self, item):
            print(item)
            return item
    a1 = A("leon",18,"")
    p = a1["name"]
    print(p)

    __setitem__(self,key,value)

    这个会把a1[值] = 值  括号里面的值传为key,赋的值传为value

    示例:

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
            self.sex = args[2]
        def __getitem__(self, item):
            print(item)
            return item
        def __setitem__(self, key, value):
            print(key,value)
        def __delitem__(self, key):
            print(key)
        def __delattr__(self, item):
            print(item)
    a1 = A("leon",18,"")
    p = a1["name"]
    print(p)
    a1["age"] = 20
    del a1["sex"]
    print(a1.sex)
    del a1.name
    print(a1.name)

    __delitem__这个是del a1[参数] 时把参数传给item

    示例:

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
            self.sex = args[2]
        def __getitem__(self, item):
            print(item)
            return item
        def __setitem__(self, key, value):
            print(key,value)
        def __delitem__(self, key):
            print(key)
        def __delattr__(self, item):
            print(item)
    a1 = A("leon",18,"")
    p = a1["name"]
    print(p)
    a1["age"] = 20
    del a1["sex"]
    print(a1.sex)
    del a1.name
    print(a1.name)

    __delattr__(self,item)  这个是当这样删除时,del a1.name时会把name传给item,

    参考示例:

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
            self.sex = args[2]
        def __getitem__(self, item):
            print(item)
            return item
        def __setitem__(self, key, value):
            print(key,value)
        def __delitem__(self, key):
            print(key)
        def __delattr__(self, item):
            print(item)
    a1 = A("leon",18,"")
    p = a1["name"]
    print(p)
    a1["age"] = 20
    del a1["sex"]
    print(a1.sex)
    del a1.name
    print(a1.name)
  • 相关阅读:
    处在什么都想学,却又不知道怎么学的处境
    启动MongoDB shell客户端会什么会一闪而过
    Socket.io发送消息含义
    轮询、长轮询与Web Socket的前端实现
    org.apache.commons.lang3.StringUtils类中isBlank和isEmpty方法的区别
    JS学习笔记10_Ajax
    JS学习笔记9_JSON
    JS学习笔记8_错误处理
    JS学习笔记7_表单脚本
    JS学习笔记6_事件
  • 原文地址:https://www.cnblogs.com/ahliucong/p/9265436.html
Copyright © 2011-2022 走看看