- type 返回对象类型
- object 返回一个新的无特征对象,object是所有类的基类
- classmethod 类方法
- staticmethod 静态方法
- propeerty 属性访问的包装类、可以像调用一个变量一样调用一个方法
- vars 返回一个模块、类、函数、实例或者其他任何一个对象包含__dict__属性的对象的__dict__
- super 返回一个代理对象,它委托方法给父类或者type的同级类
- issubclass 判断对象是否是另外一个类或者类型元组中任意类元素的子类
- isinstance 判断对象是否是类或者类型元组中任意类元素的实例
Type和Object
type为对象的顶点,所有对象都创建自type。
object为类继承的顶点,所有类都继承自object。
python中万物皆对象,一个python对象可能拥有两个属性,__class__ 和 __base__,__class__ 表示这个对象是谁创建的,__base__ 表示一个类的父类是谁。
In [1]: object.__class__
Out[1]: type
In [2]: type.__base__
Out[2]: object
可以得出结论:
- type类继承自object
- object的对象创建自type
# type(object)
>>> type(1)
<class 'int'>
>>> type('1')
<class 'str'>
>>> type([1])
<class 'list'>
>>> type((1))
<class 'int'>
>>> a=(1)
>>> type(a)
<class 'int'>
>>> type({1})
<class 'set'>
>>> type({"a":1})
<class 'dict'>
object()
如果一个类没有指定继承哪个类,则默认继承object类
object没有定义__dict__,所以不能对object类实例对象设置属性
>>> class A:
...     pass
...
>>> issubclass(A,object) # A是object子类
True
>>> dir(object) # object类定义了所有类公共方法
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> class A:
...     pass
...
>>> a=A()
>>> a.name='Hi' # 可以设置
>>> a.name
'Hi'
>>> b=object()
>>> b.name='ok' # object不可设置
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'name'
classmethod()
1、注解,用来说明这个方法是个类方法
2、类方法即可被类调用,也可以被实例调用
3、类方法中不需要有self参数,必须有cls参数
>>> class A:
...     @classmethod
...     def a(cls, msg):
...         print(cls)
...         print(msg)
...
>>> A.a('类对象调用类方法')
<class '__main__.A'>
类对象调用类方法
>>> a=A()
>>> a.a('类实例对象调用类方法')
<class '__main__.A'>
类实例对象调用类方法
staticmethod()
1、声明静态方法
2、在类中通常当作工具类来调用
3、方法中不需要有self参数也不需要有cls参数
>>> class A:
...     @staticmethod
...     def a(x,y):
...         return x+y
...
>>> A.a(3,5)
8
vars()
返回对象的变量,vars是一个好用的内置函数,在一些自动化测试中我们可以在请求中使用自定义方法,通过vars函数找到模块里相应的函数并执行,后续会详细讲到
>>> a=A()
>>> class A:
...     pass
...
>>> a=A()
>>> a.name='tom'
>>> a.__dict__
{'name': 'tom'}
>>> vars(a)
{'name': 'tom'}
>>> vars() # 如果不带参数vars()的行为就像locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'f': <function f at 0x000000000266EAE8>, 'a': <__main__.A object at 0x00000000029A5E48>, 'b': <object object at 0x000000000244B0D0>, 'A': <class '__main__.A'>}
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'f': <function f at 0x000000000266EAE8>, 'a': <__main__.A object at 0x00000000029A5E48>, 'b': <object object at 0x000000000244B0D0>, 'A': <class '__main__.A'>}
super()
1、在多继承中,可以保证顶层父类只被调用一次
2、在新式类(python3)和经典类中,用 __mro__查看多继承规律时,查找规则不同经典类是深度优先,新式类是广度优先,后续会详细讲解
>>> class A:
...     def __init__(self):
...         print('A.__init__')
...
>>> class B(A):
...     def __init__(self):
...         print('B.__init__')
...         super().__init__()
...
>>> b=B()
B.__init__
A.__init__
issubclass()
>>> class A:
...     def __init__(self):
...         print('A.__init__')
...
>>> class B(A):
...     def __init__(self):
...         print('B.__init__')
...         super().__init__()
...
>>> b=B()
B.__init__
A.__init__
>>> issubclass(B,A)
True
isinstance()
>>> issubclass(bool,int)
True
>>> issubclass(bool,str)
False
>>> issubclass(bool,(str,int))
True





 
 


Comments | NOTHING