码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象:类的内置方法

时间:2019-09-07 22:04:57      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:str   默认   style   删除   ini   course   property   内置函数   %s   

__str__和__repr__
实例化一个对象,该对象的返回值是一个指向这个类的内存地址
class A:
    pass
a = A()
print(a)

#打印:
<__main__.A object at 0x000001FA526DA108>

 

自定义__str__和__repr__方法:
class Func:
    pass
    def __str__(self):
        return 我是自定义的str
    def __repr__(self):
        return 我是自定义的repr
a = Func()
print(a)
print(repr(a))
print(str(a))

#打印:
我是自定义的str
我是自定义的repr
我是自定义的str

 

结论:
什么时候执行__str__:遇到print(obj),‘%s‘%obj,str(obj)的时候
什么时候执行__repr__:遇到repr(obj),‘%r‘%obj的时候
执行__str__时,首先找类中是否有自定义的__str__方法,若没有,则找自定义的__repr__方法,若类中没有这两个自定义方法,则向父类查找,不管在哪里找,执行__str__时,先找__str__方法,再找__repr__方法
执行__repr__时,若类中没有自定义的__repr__方法,则向父类查找,不会找__str__的自定义方法或者父类的__str__
所以,一个类中需要自定义__str__和__repr__时,首先考虑的应该是__repr__,因为他可以被str使用
 使用场景:实例化一个对象,对象的返回值默认是指向这个类的一个内存地址,当打印这个对象时,遇到print会执行这个类的内置函数__str__,若在类中自定义__str__这个方法,则可以设置成其他更直观的返回值,返回值必须为字符串类型
class Teacher:
    def __init__(self,name,course):
        self.name = name
        self.course = course
    def __repr__(self):
        return 我是老师%s,教%s的%(self.name,self.course)

aike = Teacher(aike,python)
print(aike)
print(str(aike))
print(repr(aike))

#打印:
我是老师aike,教python的
我是老师aike,教python的
我是老师aike,教python的

 


__len__:
在外部调用len方法,传入实例化的对象,实际上执行的是这个类的__len__方法,当类里自定义过__len__方法,外部用对象使用len时,会先找自定义的__len__方法,而这个自定义的__len__方法需要实现什么功能,可以自己自定义,返回值必须为int的数据类型
class A:
    pass
    def __len__(self):
        print(执行了我)
        return 2
a = A()
print(len(a))

#打印:
执行了我
2

 

例::
class Grade:
    def __init__(self,teacher):
        self.teacher = teacher
        self.student = []
three_grade = Grade(aike)
three_grade.student.append(chen)
three_grade.student.append(chen)
three_grade.student.append(chen)
print(len(three_grade.student))#没有自定义的len方法,向父类找

#打印:
3


class Grade:
    def __init__(self,teacher):
        self.teacher = teacher
        self.student = []
    def __len__(self):
        return len(self.student)

three_grade = Grade(aike)
three_grade.student.append(chen)
three_grade.student.append(chen)
three_grade.student.append(chen)
print(len(three_grade))#调用的是自定义的len方法

#打印:
3

 


__del__:称为构析函数,主要作用是在删除一个对象之前进行一些收尾工作;同理,类中有自定义的del方法时,优先执行自定义的,没有则向父类找,需要注意的是,尽管自定义的del方法没有实现删除操作,但执行完后依然会执行父类的del方法进行删除操作  
class A:
    pass
a = A()
del a
print(a)#报错,a已经删除
class A:
    pass
    def __del__(self):
        print(删除之前执行了我,执行之后依然进行删除操作)
a = A()
del a
print(a)#报错,a已经删除,但类中自定义的del方法会执行

 

 

__call__:在实例化一个类时,在后边加上(),执行的就是call方法,它没有返回值,所以没有真正实例化一个对象出来,所以call方法中的操作不会影响到其它对象

class Person:
    def __init__(self,name,money):
        self.name = name
        self.__money = money

    def __call__(self, money):
        self.__money += money
        print(self.__money)

    @property
    def money(self):
        return self.__money

aike = Person(aike,1000)(100)
print(aike)#执行call无返回值
# print(aike.money)#报错,没有aike这个对象
aike1 = Person(aike,1000)
print(aike1.money)

#打印:
1100
None
1000

 

面向对象:类的内置方法

标签:str   默认   style   删除   ini   course   property   内置函数   %s   

原文地址:https://www.cnblogs.com/aizhinong/p/11483283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!