面向对象进阶————常用的方法
1. __str__
通常我们创建一个类方法的时候,如果我们创建一个对象,直接打印这个对象的时候,打印的结果返回的会是一个内存地址。这是因为我们创建一个对象的时候,打印一个对象会调用__str__这个函数,正常情况下,如果创建的类中没有__str__这个方法,它会继承父类(object类)中的str方法。
类似如下:
class A: def __str__(self): return ('i am A') a = A() print(a) class B: pass b = B() print(b) i am A <__main__.B object at 0x000001614D2F8160> Process finished with exit code 0
2. __repr__
我们通常见到repr这个方法,如下一个例子可以看出这个方法的用途:
print('1') print(repr('1')) 1 '1' Process finished with exit code 0
但是,在类中,__repr__相当于什么,也是可以直接打印出来,具体怎么用呢,可以这样看:
class A: # def __str__(self): # return ('i am A') def __repr__(self): return 'i am A backup' a = A() print(a) i am A backup Process finished with exit code 0
当没有__str__时,它会寻找__repr__,也就是说,它是备胎。。。
我们可以通过%r %s来调用相应的字符串。
class A: def __str__(self): return ('i am A') def __repr__(self): return 'i am A backup' a = A() print('>>>%r'%a) print('>>>%s'%a) >>>i am A backup >>>i am A Process finished with exit code 0
3.__new__方法
__new__方法是一个非常重要的方法。你肯定印象中有过这个一句话,没对象怎么办?new一个出来啊。。。事实上,在python中,当我们通过class创建一个类的时候,实际上是先‘new’一个对象出来,然后将这个对象传递给__init__,之后将这个对象进行实例化,赋予对象的各种属性。可以通过下面的代码进行理解:
class A: def __init__(self,name,age): print('我是第二个') self.name = name self.age = age def __new__(cls, *args, **kwargs): print('我是第一个') return object.__new__(cls)
a = A('Chen',18)
我是第一个 我是第二个
Process finished with exit code 0
可以看出,当我们实例化创建一个对象的时候,首先是通过new方法创建一个对象,然后再讲这个函数的返回值传递给init。这个例子中,当我们创建一个对象的时候,首先会使用‘A‘里面的new方法,打印出来后,然后继承object中的new方法,将返回值传递给init。
但是,知道了有什么用呢?其实,有很多用途的,在设计模式中,有其中一种单例模式,在python中就是利用new构造的。具体代码如下:
class A: __instance = False def __init__(self,name,age): self.name = name self.age = age def __new__(cls, *args, **kwargs): if cls.__instance: return cls.__instance cls.__instance = object.__new__(cls) return cls.__instance a = A('Chen',18) b = A('ZZ',23) print(a.name)
打印的结果最后是zz。。。。。。。
4.__getintem__/__setitem__/__delitem__
这几个就是字典和列表如何产生的,就是基于这几个方法,python中一切皆对象,当我们使用这些方法的时候,就可以在类中通过字典的方法调用这些属性。
# Author:Zhang Zhao # -*-coding:utf-8-*- class A: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): if hasattr(self,item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key] = value def __delitem__(self, key): del self.__dict__[key] a = A('chen',18) print(a['name']) a['hobby'] = 'sleep' print(a.hobby) print(a['hobby']) del a['name'] if hasattr(a,'name'): print(a.name) else: print('non-existing') chen sleep sleep non-existing Process finished with exit code 0
可以从上述方法中进行属性添加、获取或者删除。
5.__eq__
__eq__方法是判断类中对象是否相等的一个方法。我们直接创建两个各种变量都相同的类的时候,我们打印两个实例是否相等时,结果是不相等的,因为__eq__默认返回的值是实例化后的两个实例的内存地址,所以,如果要通过某些属性来判断两个实例相等,就需要重新构造__eq__方法。
# Author:Zhang Zhao # -*-coding:utf-8-*- class A: def __init__(self,name): self.name = name def __eq__(self, other): if self.name == other.name: return True else: return False ob1 = A('egg') ob2 = A('egg') print(ob1 == ob2)