Python3 *args **kwargs使用小记、类的属性搜索、新式类的继承

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/haeasringnar/article/details/98661081
# 1
def test(*args,**kwargs):
  print('args:',args)
  print('kwargs:',kwargs)


test(1,2,{'a':'qwe','b':'asd'}) # 这样就都认为是args的参数
test(1,2,key={'a':'qwe','b':'asd'}) # 这样就会拆开,前面是args的参数,后面的key-value 属于kwargs的参数
# test(key1=1,2,key2={'a':'qwe','b':'asd'}) # 这样就会报错 不可以混用
test(key1=(1,2,),key2={'a':'qwe','b':'asd'}) # 接收key-value 属于kwargs的参数

# 2
# 菱形继承
class A():
  pass

class B(A):
  pass

class C(A):
  pass

class D(B,C):
  pass

# 菱形继承时的属性查找顺序
print(D.__mro__)

# 树形继承
class E():
  pass

class F():
  pass

class G(E):
  pass

class H(F):
  pass

class J(G,H):
  pass

# 树形继承时的属性查找顺序
print(J.__mro__)

# 它可以找到B的继承顺序,在python3中属性搜索的算法已经变更为了C3算法
# 以前是 BFS广度优先 DFS深度优先


# 3
class A():
  pass

class B(A):
  pass

b = B()

print(isinstance(b,B))
print(isinstance(b,A))

print(type(b) == B)
print(type(b) == A)

'''
返回结果:11 10
因为B是继承A的,所以b必然也是A类型,那么为什么type找到的类型不正确呢,
因为type并没有继续向上层找类型,所以在python更加建议使用isinstance而不是type
'''
# 它可以找到B的继承顺序,在python3中属性搜索的算法已经变更为了C3算法
# 以前是 BFS广度优先 DFS深度优先
print(B.__mro__) 
# __bases__ 用于返回对象的基类
print(B.__bases__)
# python里面dict 对象.__dict__很高效 __dict__ 主要用于将类中的属性像字典一样返回
print(B.__dict__)
print(b.__dict__)
# python中实例/类.__dict__和dir用法类似,但dir要高级一点,dir用于返回类或实例的所有属性和方法,区别:__dict__返回键值对 dir不返回值
print(dir(B))
print(dir(b))
# __dict__ dir 也被称为自省机制

# 在python中class也是一个对象,class->type->object,object是最顶层的基类 type.__bases__  返回object类
print(type(b))
print(type(B))
print(type(A))
print(type(type))
print(type(object))
print(type.__bases__)
# object.__bases__ 返回的是空,
print(object.__bases__)
print(type.__mro__)

# 4
class A():
  def __init__(self):
    print('A')

class B(A):
  def __init__(self):
    print('B')
    # super(B,self).__init__() # 老式的继承父类的方法
    super().__init__() # 新式的继承父类的方法

b = B()

猜你喜欢

转载自blog.csdn.net/haeasringnar/article/details/98661081
今日推荐