博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python面向对象的特殊方法和单例模式
阅读量:5136 次
发布时间:2019-06-13

本文共 4819 字,大约阅读时间需要 16 分钟。

主要内容:

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 Truea1 = 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.nameprint(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.__instancea1 = 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 itema1 = 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"] = 20del a1["sex"]print(a1.sex)del a1.nameprint(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"] = 20del a1["sex"]print(a1.sex)del a1.nameprint(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"] = 20del a1["sex"]print(a1.sex)del a1.nameprint(a1.name)

 

转载于:https://www.cnblogs.com/ahliucong/p/9265436.html

你可能感兴趣的文章
hdu1716 排列2
查看>>
蓬莱山辉夜
查看>>
为什么函数式组件没有生命周期?
查看>>
sql 查询名字中有_的员工
查看>>
solr 常见异常
查看>>
HDU 6044--Limited Permutation(搜索+组合数+逆元)
查看>>
PAT (Basic Level) Practise - 换个格式输出整数
查看>>
bzoj1901:Zju2112 Dynamic Rankings
查看>>
POJ 2104 K-th Number
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
Django之Auth模块 实现登录,退出,自带session 与认证功能的一个重要的模块
查看>>
【机器学习_10】十大基础算法:分类_逻辑回归
查看>>
A+B Format
查看>>
SVN
查看>>
LeetCode - N-Queens II
查看>>
sublime3+quick智能提示
查看>>
UIDevice的简易说明
查看>>
Smarty模板引擎技术(一)
查看>>
nodejs中安卓端的编码如何转换为中文
查看>>
实验四
查看>>