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)
  • 相关阅读:
    【Language】 TIOBE Programming Community Index for February 2013
    【diary】good health, good code
    【web】a little bug of cnblog
    【Git】git bush 常用命令
    【web】Baidu zone ,let the world know you
    【diary】help others ,help yourself ,coding is happiness
    【Git】Chinese messy code in widows git log
    【windows】add some font into computer
    SqlServer启动参数配置
    关于sqlserver中xml数据的操作
  • 原文地址:https://www.cnblogs.com/zz1314/p/10434955.html
Copyright © 2011-2022 走看看