python-38-用于面向对象的内置函数

Posted 广深-小龙 --扬帆起航!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-38-用于面向对象的内置函数相关的知识,希望对你有一定的参考价值。

前言

在面向对象中有很多内置方法,你会发现都很容易知道它的用处与平时用到的函数一样。

  • 1、__str__
  • 2、__repr__
  • 3、__len__
  • 4、__del__
  • 5、__call__
  • 6、item系列
  • 7、__new__
  • 8、__eq__
  • 9、__hash__

1、__str__:一旦被调用,就返回调用这个方法的对象的内存地址。

# 1、__str__:一旦被调用,就返回调用这个方法的对象的内存地址
class A:
    def __init__(self,name):self.name=name
    def __str__(self):
        return \'A is object \'+self.name
res = A(\'广深小龙\')
print(res)  # 打印一个对象,相当于调用了a.__str__
print(\'%s:%s\'%(\'A:\',res))

 2、__repr__:

  • repr(),只会找__repr__,如果没有找父类的,优先推荐repr。
  • 如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
  • print(obj)/\'%s\'%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串。
# 2、__repr__:
class A:
    def __init__(self,name):self.name=name
    def __str__(self):
        return \'A is object \'+self.name
    def __repr__(self):return str(self.__dict__)
res = A(\'广深小龙\')
print(res)  # 打印一个对象,相当于调用了a.__str__
print(\'%s:%s\'%(\'A:\',res))
print(repr(res))

 3、__len__:内置方法有很多,可以定制自己的内置方法

# 3、__len__:内置方法有很多,可以定制自己的内置方法
class A:
    def __init__(self,name):
        self.name=[]
    def __len__(self):
        return len(self.name)+1
res=A(\'小龙龙\')
res.name.append(\'广深小龙\')
res.name.append(\'广深小龙\')
print(len(res))

4、__del__:析构函数:

删除一个对象之前,进行一些收尾工作

# 4、__del__:析构函数
# 删除一个对象之前,进行一些收尾工作
class A:
    def __del__(self):
        print(\'执行我了\')
a=A()
del a   # 既执行了del方法,也删除了变量a

 5、__call__,调用能直接返回想要返回的功能,不用传方法名称:

# 5、__call__,调用能直接返回想要返回的功能,不用传方法名称
class A:
    def __init__(self,name):self.name=name
    def __call__(self, *args, **kwargs):
        print(self.__dict__)
a=A(\'小龙龙\')()        # 调用内部__call__方法

 6、item系列:

①list:增删查改

# 1、list:增删查改
class A:
    def __init__(self,name):self.name=name
    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(\'广深小龙\')
print(a[\'name\'])    #
a[\'age\']=\'22\'       #
print(a.age)
a[\'age\']=\'55\'       #
print(a[\'age\'])
del a.name           #
del a[\'age\']
print(a.__dict__)

7、__new__:构造方法

# 2、__new__:构造方法
class A:
    def __init__(self):
        print(\'init\')
    def __new__(cls, *args, **kwargs):  # 会先执行__new__方法
        print(\'__new__\')
        return object.__new__(A, *args, **kwargs)
a = A()
# 会先执行cls,object.__new__,再执行self的__init__

7-1、设计模式:单列模式

  • 一个类只有一个实例,多个实例内存地址是一样。
  • 当你第一次实例化这个类的时候 就创建一个实例化的对象。
  • 当你之后再来实例化的时候 就用之前创建的对象。
class A:
    __res=False
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __new__(cls, *args, **kwargs):  # 会先执行__new__方法
        if cls.__res:
            return cls.__res
        cls.__res=object.__new__(A)
        return cls.__res
a = A(\'广深小龙\',\'22\')
b = A(\'小龙女\',\'18\')
print(a)
print(b)
print(a.name)
print(b.name)
a.addr=\'广深\'
print(b.addr)   # a追加,但b也有。单列模式

 

 8、__eq__:比较两个值,也是可定制处理。

# 8、__eq__:比较两个值,也是可定制处理
class A:
    def __init__(self,name):
        self.name=name
    def __eq__(self, other):
        if self.name==other.name:
            print(\'%s 就是等于 %s\'%(self.name,other.name))
            return True
        else:False
res1=A(\'gsxl\')
res2=A(\'gsxl\')
print(res1==res2)   # 正常是不相等,但__eq__可以定制处理

 

9、__hash__:定制化将哈希函数。

# 9、__hash__:定制化将哈希函数
class A:
    def __init__(self,name,hname):
        self.name=name
        self.hname=hname
    def __hash__(self):
        return hash(self.name+self.hname)

res1=A(\'gsxl\',\'2233\')
res2=A(\'gsxl\',\'2233\')
print(hash(res1))
print(hash(res2))

 

 欢迎来大家QQ交流群一起学习:482713805 !!!

以上是关于python-38-用于面向对象的内置函数的主要内容,如果未能解决你的问题,请参考以下文章

面向对象之内置方法

面向对象_内置函数与内置方法

面向对象的内功心法

反射(高大上)类的内置方法

JAVA方法的定义

VSCode自定义代码片段——JS中的面向对象编程