内置函数issubclass()用于判断类对象与类对象之间的关系。
内置函数issubclass()用于判断实例对象与类对象之间的关系。
内置函数issubclass接收两个实参,
第一个实参是类对象,
第二个实参是类对象或由类对象组成的元组,
当第二个实参是类对象时,如果第一个实参是第二个实争的子类,那么退回True,
当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类,则返回True
class A(object):
pass
class B(object):
pass
class C(object):
pass
class D(A):
pass
print(issubclass(D,A))
print(issubclass(D,B))
print(issubclass(D,(B,A,C)))
print(issubclass(D,(B,C)))
print(issubclass(bool,int))
print(issubclass(bool,str))
print(issubclass(bool,(str,int,dict)))
print(issubclass(bool,(str,list,dict)))
True
False
True
False
True
False
True
False
type()获取指定对象的类型
class MyClass(object):
pass
mc = MyClass()
print(type(mc))
<class '__main__.MyClass'>
print(type(18))
<class 'int'>
print(type(MyClass))
<class 'type'>
print(type(int))
<class 'type'>
#所有类对象的type就是type
def do_sth():
pass
print(type(do_sth))#函数的类型是function
<class 'function'>
print(type(dir))#内置函数的类型是
<class 'builtin_function_or_method'>
可以使用运算符==判断某个对象的类型是否是指定的类型
对于基本数据类型,可直接使用其对应的类名,如果不是基本数据类型,需要使用标准库中的模块types中定义的变量
print(type(18) == int)
True
print(type(do_sth)== function)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-15-a52053de46b4> in <module>
----> 1 print(type(do_sth)== function)
NameError: name 'function' is not defined
print(type(print)== builtin_function_or_method)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-16-d970e74506af> in <module>
----> 1 print(type(print)== builtin_function_or_method)
NameError: name 'builtin_function_or_method' is not defined
import types
print(type(do_sth)== types.FunctionType)
print(type(print)== types.BuiltinFunctionType)
True
True
dir()
#对于制定的类对象或实例对象,可以调用函数dir()获得其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表
类对象与实例对象的结果是有区别的,类对象的结果中不包括实例属性
class MyClass(object):
ca = 'ca'
def __init__(self):
self.ia = 'ia'
def im(self):
pass
@classmethod
def cm(cls):
pass
@staticmethod
def sm():
pass
print(dir(MyClass))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm']
print(dir(MyClass()))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'ia', 'im', 'sm']
属性之增删改查
hasattr()
getattr()
setattr()
delattr()
hasattr(object,name)
用于获取指定的对意Robject中名为name的属性或方法。
如来不地fat么ae的展性理方料mtgetattr(object,name)等价于: object.name,3”setattrfobject, ane, vaLue)
4. detattrlobject, name--用于在持定的对最biect中添加度督改名为参数me的属性或方法, 系加或修改后的值vl.setattrlobiecL nane value)等价于bject.name三value,
用于删除指定的对象bject中名为参数name的属性或方法。delattrlobject, name)等价于: del object. name。
注意只有在不知道对象信息的情况下,才会去获取对象的信息。因此,如果可以直接写: object.name,就不要写为getattr(object, ↑ name' )。
class MyClass(object):
def __init__(self):
self.x = 1
def do_sth(self):
print('do_sth被调用')
mc = MyClass()
print(hasattr(mc,'x'))
print(hasattr(mc,'do_sth'))
print(hasattr(mc,'y'))
True
True
False
print(getattr(mc,'x'))
1
print(getattr(mc,'y'))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-34-ee6c76a7fba4> in <module>
----> 1 print(getattr(mc,'y'))
AttributeError: 'MyClass' object has no attribute 'y'
print(getattr(mc,'y',2))
2
print(getattr(mc,'y','查找的属性或方法不存在'))
查找的属性或方法不存在
setattr(mc,'z',3)
print(getattr(mc,'z'))
3
delattr(mc,'z')
print(hasattr(mc,'z'))
False
算术运算符重载
自己定义的类可以用加法来做
class MyClass1(object):
pass
class MyClass2(object):
pass
print(MyClass1()+MyClass2())#标准算术运算符在默认情况下不能用于自定义类对象的实例对象,
#必须在自定义类对象中实现标准算数运算符对应的以下特殊方法
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-39-ce5056f11b9c> in <module>
----> 1
print(MyClass1()+MyClass2())
NameError: name 'MyClass1' is not defined
#标准算术运算符在默认情况下不能用于自定义类对象的实例对象,
#必须在自定义类对象中实现标准算数运算符对应的以下特殊方法
- +对应的特殊方法是__add__()和__radd__();
- -对应的特殊方法是__sub__()和__rsub__();
- *对应的特殊方法是__mul__()和__rmul__();
- /对应的特殊方法是__truediv__()和__rtruediv__()
- //对应的特殊方法是__floordiv__()和__rfloordiv__()
实例化对象在运算符的右边要用到r的那边
先看左边的调用对象有没有方法,有的话直接调用,两个都没有就报错
class MyClass1(object):
def add(self,other):
return '这是__add__+的结果’
class MyClass2(object):
def radd(self,other):
return '这是__radd__+的结果’
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1 + obj2)
File “”, line 3
return '这是__add__+的结果’
^
SyntaxError: EOL while scanning string literal
str()与__repr__()
用于并返回实例对象的字符串表示形式
#第一系列
class MyClass(object):
pass
mc = MyClass()
mc
<main.MyClass at 0x1baf17000f0>
print(mc)
<main.MyClass object at 0x000001BAF17000F0>
str(mc)
‘<main.MyClass object at 0x000001BAF17000F0>’
repr(mc)
‘<main.MyClass object at 0x000001BAF17000F0>’
#第二系列
class MyClass(object):
def str(self):
return ‘__str__被调用’
mc = MyClass()
mc
<main.MyClass at 0x1baf1700b70>
print(mc)
__str__被调用
str(mc)
‘__str__被调用’
repr(mc)
‘<main.MyClass object at 0x000001BAF1700B70>’
#repr比str管的多
类对象的特殊方法之__ str__ ()和__ repr__ ()用于自定义并返回实例对象的字符串表示形式。
1.当在交互式命令行中直接打印一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法__repr__(), 会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
2.当调用内置函数print打印一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法_ str__ (), 会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法_ repr__ (), 会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
3,当调用内置函数str创建字符串并且实参是-一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法__ str__ (), 在内置函数st r的内部会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法__ repr__ (), 在内置函数str的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
4.当调用内置函数repr创建字符串并且实参是一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法__ repr__ (), 在内置函数repr的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。通常情况下,类对象的特殊方法_ str_ ()和__ repr__ ()的实现代码是一 样的,因此,当实现了其中一个后,可以把其方法名赋值给另一个的方法名。