面向对象进阶————常用的方法

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)

 

posted @ 2019-02-26 03:52  妇愁者  阅读(155)  评论(0编辑  收藏  举报