面向对象编程四
issubclass()与isinstance()
-
内置函数issubclass()
- 用于判断类对象之间的关系 - 内置函数issubclass接收两个实参:第一个实参是类对象,第二个实参是类对象或由类对象组成的元组: 1、 当第二个实参是类对象时,如果第一个实参是第二个实参的子类,那么返回True 2、当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类,返回True
-
内置函数isinstance()
- 用于判断实例对象与类对象之间的关系 - 内置函数isinstance接收两个实参:第一个实参是实例对象,第二个实参是类对象或由类对象组成的元组: 1、当第二个实参是类对象,如果第一个实参是滴二个实参的实例对象,或者第一个实参是第二个实参的子类的实例对象,那么返回True 2、当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象或其子类的实例对象,那么返回True
type()与dir()
-
type()
- 内置函数type()用于获得指定对象的类型 - 实例对象的类型是其对应的类对象 - 类对象的类型是type,也就是说,类对象是type的一个实例对象 - 自定义函数对象的类型是function - 内置函数对象的类型是builtin_function_or_method ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190524141347954.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzk5NTA3,size_16,color_FFFFFF,t_70) - 可以使用运算符==判断某个对象的的类型是否是指定类型 - 对于基本数据类型,可以直接使用其对应的类名;如果不是基本数据类型,需要使用标准库中的模块types中定义的变量![在这里插入图片描述](https://img-blog.csdnimg.cn/20190524142315681.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzk5NTA3,size_16,color_FFFFFF,t_70)
-
dir()
- 对于制定的类对象或实例对象,可以调用内置函数dir()获得其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表 - 类对象与实例对象的结果是有区别的,**类对象的结果中不包括实例属性** - 调用内置函数dir()后的返回值中,很多属性和方法都是以双下划线__开头和结尾的,这些属性和方法中的绝大多数都继承自类object - 以双下划线__开头和结尾的属性被称为特殊属性,以双下划线 __开头开头和结尾的方法被称为特殊方法 - 特殊属性和特殊方法都是系统预定义的,我们自定义的属性名和方法名不要以双下划线开头和结尾 - 在我们自定义类对象时,经常会重写一个或多个特殊方法,例如__init__.特殊方法会在特定的情形下被自动调用,很少需要手动调用特殊方法
属性之增删改查
1、hasattr(object,name)
- 用于判断指定的对象object是否有参数name指定的属性或方法
2、getattr(object,name[,default]) - 用于获取指定的对象object中名为name的属性或方法
- 如果不指定参数default,那么当object中不存在名为name的属性或方法时,抛出AttributeError
- 如果指定了参数default,那么当object中不存在名为name的属性或方法时,就会返回default
- getattr(object,name)等价于:object.name
3、setattr(object,name,value) - 用于在指定的对象object中添加或修改名为参数name的属性或方法,添加或修改后的值为value
- setattr(object,name,value)等价于:object.name = value
4、delattr(object,name) - 用于删除指定的对象object中名为参数name的属性或方法
- delattr(object,name)等价于:del object.name
注意:只要在不知道对象信息的情况下,才会去获得对象的信息。因此如果可以直接写:object.name,就不要写为getattr(object,‘name’)
算术运算重载
- 算术运算重载相关函数:
add() | radd() |
---|---|
sub() | rsub() |
mul() | rmul() |
truediv() | rtruediv() |
floordiv() | rfloordiv() |
-
标准算术运算符在默认情况下不能自定义类对象的实例对象,如果想让标准运算符可以用于自定义类对象的实例对象,必须在自定义对象中实现标准算术运算符对应的以下特殊方法:
1、+对应的特殊方法是__add__()和__radd__()
2、-对应的特殊方法是__sub__()和__rsub__()
3、*对应的特殊方法是__mul__()和__rmul__()
4、/对应的特殊方法是__truediv__()和__rtruediv__()
5、//对应的特殊方法是__floordiv__()和__rfloordiv__()
str()与__repr__()
类对象的特殊方法之__str__()和__repr__()用于自定义并返回实例对象的字符串表示形式
1、当在交互式命令中直接打印一个实例对象时,
- 如果在实例对象对应的类对象中实现了特殊方法__repr__(),会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
2、当调用内置函数print打印一个实例对象时,
- 如果在实例对象对应的类对象中实现了特殊方法__str__(),会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法__repr_(),会自动该方法;否则,会打印实例对象对应的类对象和实例对象在内存中党的地址。
3、 当调用内置函数str创建字符串并且实参是一个实例对象时,
- 如果在实例对象对应的类对象中实现了特殊方法__str__(),在内置函数str的内部会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法__str__(),在内置函数str的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址
4 、当调用内置函数repr创建字符串并且实参是一个实例对象时,
- 如果在实例对象对应的类对象中实现了特殊方法__repr__(),在内置函数repr的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
-
第一系列
-
第三系列
-
第四系列
通常情况下,类对象的特殊方法__str__()和__repr__()的实现代码是一样的,因此,当实现了其中一个后,可以把其方法名赋值给另一个的方法名。
>>>class OneClass(object):
def __str__(self):
return "这是实例对象党的字符串表示形式”
__repr__ = __str__
内置函数str()和repr()读返回对象的字符串表示,其区别在于:
- str()的返回值是给用户看的,更加用户友好
- repr()的返回值是给程序开发者看的,是为调试服务的
>>str("hello,\nworld")
>'hello,\nworld'
>>>repr("hello,\nworld")
>" 'hello,\nworld' "
今天的更博就到这里了,后续还会有更多博文更新哟