Python学习总结( 四 )


Python学习总结文章插图
几个规则:

  1. 一切都是对象 , python中一切都是对象 , 每个对象都包含一个__class__属性以标记其所属类型 。
  2. 每个对象(记得一切都是对象啊)都包含一个__dict__属性以存储所有属性和方法 。
  3. 每个类型都包含一个__bases__属性以标记其父类 。
  4. 属性和方法的访问规则:依次搜索instance、子类、父类、父类的父类、直到object的__dict__ , 如果找到就返回 。
  5. 属性和方法的设置规则:直接设置instance.__dict__ 。
  6. 以上属性和方法访问或设置规则没有考虑“魔法方法” , 下文会解释 。
示例
1 # coding=utf-8 23 __metaclass__ = type 45 # 类型定义 6 # 实例方法必的第一个参数代表类型实例 , 类似其他语言的this 。7 class Animal: 8name = "未知" # 属性定义 。9 10def __init__(self, name): #构造方法定义 。 11self.name = name12 13def getName(self): # 实例方法定义 。 14return self.name15 16def setName(self, value):17self.name = value18 19 print(Animal.name) # 未知20 print(Animal.__dict__["name"]) # 未知21 22 animal = Animal("狗狗")23 print(animal.name) # 狗狗24 print(animal.__dict__["name"]) # 狗狗25 print(Animal.name) # 未知26 print(Animal.__dict__["name"]) # 未知27 print(animal.__class__.name) # 未知28 print(animal.__class__.__dict__["name"]) # 未知1 # 类型定义中的代码会执行 , 是一个独立的作用域 。 2 class TestClass:3print("类型定义中") #类型定义中绑定方法和未绑定方法
1 class TestClass: 2def method(self): 3print("测试方法") 45 test = TestClass() 6 print(TestClass.method) # 7 print(test.method) #> 89 TestClass.method(test) #测试方法10 test.method() #测试方法绑定方法已经绑定了对象示例 , 调用的时刻不用也不能传入self参数了 。
注:使用对象访问实例方法为何会返回绑定方法?这个还得等到学完“魔法方法”才能解释 , 内部其实是拦截对方法成员的访问 , 返回了一个Callable对象 。
私有成员
1 # 私有成员2 class TestClass:3__private_property = 14 5def __private_method():6pass7 8 print(TestClass.__dict__) # {'__module__': '__main__', '_TestClass__private_method': , '_TestClass__private_property': 1难怪访问不了了 , 名称已经被修改了 , 增加了访问的难度而已 。
多重继承
1 #多重继承 2 class Base1: 3pass 45 class Base2: 6pass 78 class Child(Base2, Base1): 9pass10 11 child = Child()12 print(isinstance(child, Child)) # True13 print(isinstance(child, Base2)) # True14 print(isinstance(child, Base1)) # True如果继承的多个类型之间有重名的成员 , 左侧的基类优先级要高 , 上例子Base2会胜出 。
接口那里去了 , 鸭子类型比接口更好用 。
1 class TestClass1: 2def say(self): 3print("我是鸭子1") 45 class TestClass2: 6def say(self): 7print("我是鸭子2") 89 def duck_say(duck):10duck.say()11 12 duck_say(TestClass1()) # 我是鸭子113 duck_say(TestClass2()) # 我是鸭子2调用父类
1 # 调用父类 2 class Base: 3def say(self): 4print("Base") 56 class Child(Base): 7def say(self): 8Base.say(self) 9super(Child, self).say()10print("Child")11 12 child = Child()13 child.say()