面向对象编程2

issubclass()与isinstance()

内置函数issubclass()用于判断类对象与类对象之间的关系

接受两个参数:
第一个实参是类对象;
第二个实参是类对象或由类对象组成的元组。

第二个参数是类对象时,如果第一个实参是第二个实参的子类,那么返回True.
第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类,那么返回True.

print(issubclass(bool,int))
True

print(issubclass(bool,(str,int,dict)))
True

内置函数isinstane()用于判断实例对象与类对象之间的关系

接受两个实参:
第一个实参是实例对象对象;
第二个实参是类对象或由类对象组成的元组。

第二个实参是类对象时,如果第一个实参是第二个实参的实例对象,或者第一个实参是第二个实参的子类的实例对象,那么返回True

type()与dir()

type()
实例对象的类型是其对应的类对象

class Myclas(object):
pass
mc = MyClass()

print(type(mc))
<class’main.MyClass’>

print(type(MyClass))
<class’type’>

def do_sth():
pass

print(type(do_sth))
<class’function’>

print(type(dir))
<class’builtin_function_or_method’>

print(type(dir()))
<class’list’>

可以使用运算符==判断某个对象的类型是否是指定类型。
只适用于基本数据类型。

import types
print(type(do_sth) == types.FunctionType)
print(type(print) == types.BuiltinFunctionType)
True
True

dir()
类对象的结果中不包含实例属性
class MyClass(object):
ca = ‘ca’

def init(self):
self.q
dir( )

调用内置函数dir( )后的返回值中,很多属性和方法都是以双下划线_开头和结尾的, 这些属性和方法中的绝大多数都继承自类object.
以双下划线__开头和结尾的属性被称为特殊属性, 以双下划线_开头和结尾的方法被称为特殊方法。特殊属性和特殊方法都是系统预定义的,我们自定义的属性名和方法名不要以双下划线_开头和结尾。在我们自定义类对象时,经常会重写一个或多个特殊方法,例如_ init_. 特殊方法会在特定的情形 下被自动调用,很少需要手动调用特殊方法。

print (dir (object))
[,- lass’,’- delattr.’,’- dir’.’- .doe,-’:’. ea,’:’- format_’’, 8e_’,’- getattribute.’’,’ - gt
hash_’ _ new_,’reduce_ ”, ’ _ reduc, e ex’,’_ repr_’,’_ setattr_ ’,’sizeof_ ’,’str_ ’。’subclasshook_]

算术运算符重载

标准算术运算符在默认情况下不能用于自定义类对象的实例对象。

class MyClass1 (object):
pass

class MyClass2(object):
pass
print (MyClass1( + MyClass20)

报错

如果想让标准算术运算符可以用于自定义类对象的实例对象,
必须在自定义类对象中实现标准算术运算符对应的以下特殊方法:

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的内部会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法repr_ (), 在内置函数str的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。

4.当调用内置函数repr创建字符串并且实参是一一个实例对象时,
如果在实例对象对应的类对象中实现了特殊方法repr_ (), 在内置函数repr的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。

通常情况下,类对象的特殊方法str_ .()和_ repr_ ()的实现代码是- 样的,因此,当实现了其中-一个后,可以把其方法名赋值给另-一个的方法名。

class MyClass (object):
def_ str_ (self):
return”这是实例对象的字符串表示形式”

内置函数str()和repr()都返回对象的字符串表示,其区别在于:
str()的返回值是给用户看的,更加用户友好;
repr()的返回值是给程序开发者看的,是为调试服务的。

str(“He1lo, \nworld!”)
’Hello, \nworld!’
repr(“Hello, \nworld!”)
”Hello, \nworld!’”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值