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)

 

posted @ 2018-07-04 21:29  auxiaoliu  阅读(110)  评论(0编辑  收藏  举报