zoukankan      html  css  js  c++  java
  • 面向对象进阶————常用的方法

    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)
  • 相关阅读:
    HTML
    python io
    python 线程进程
    python socket
    python 面向对象2
    python 面向对象
    python hashlib模块
    python configparser模块
    python logging模块
    数组去重方法汇总
  • 原文地址:https://www.cnblogs.com/zz1314/p/10434955.html
Copyright © 2011-2022 走看看