Python 面向对象编程
wanxingdai
8年前
<ul> <li><strong>关键字:</strong> 类、实例、继承、类属性、实例属性、私有变量、特殊变量</li> </ul> <pre> <code class="language-python"># 声明一个类(class) classAnimal(object): defeat(): print('Animal can eat~') # 声明一个子类 Dog,继承自 Animal classDog(Animal): # 声明一个特殊公有变量(类属性) __fatherClass__ = 'Animal' # 声明一个私有变量(类属性) __currentClass = 'Dog' # 新建实例时的初始化函数 # 私有变量 __name,__age 为实例属性 def__init__(self,name,age): self.__name = name self.__age = age defwho(self): print('A dog, named %s' % self.__name) # 重写父类的 eat 方法 defeat(): print('Dog can eat~') # 声明一个子类 Cat,继承自 Animal classCat(Animal): # 重写父类的 eat 方法 defeat(): print('Cat can eat~') # 新建一个实例(instance) dog = Dog('二哈', 3) # __dict__ 存储实例属性 # dog.__dict__ => {'_Dog__name': '二哈', '_Dog__age': 3} </code></pre> <ul> <li><strong>__name:</strong> 定义私有属性(前面是两个下划线)</li> <li><strong>__name__:</strong> 定义特殊公有属性</li> <li><strong>__dict__:</strong> 存储实例属性</li> <li><strong>dir(obj):</strong> 查看当前对象所有的属性方法</li> <li><strong>注意区分实例属性和类属性</strong></li> <li><strong>继承</strong> 最大的好处是子类获得了父类的全部功能</li> <li><strong>多态</strong> 是同一个行为具有多个不同表现形式或形态的能力,比如上面代码的 eat 行为有多种不同的表现</li> </ul> <pre> <code class="language-python"># 检测对象是否拥有某个属性 hasattr(dog, '__name') => False hasattr(dog, '_Dog__name') => True getattr(dog, '_Dog__name') => '二哈' </code></pre> <h3>高级概念</h3> <ul> <li> <p>关键字:__slots__、@property</p> </li> <li> <p>__slots__ 用来限制实例添加自定义属性,子类实例允许定义的属性就是自身的 __slots__ 加上父类的 __slots__</p> </li> </ul> <pre> <code class="language-python"># 声明一个类(class) classAnimal(object): # 限制实例可绑定的属性 __slots__ = () defeat(): print('Animal can eat~') # 声明一个子类 Dog,继承自 Animal classDog(Animal): # 限制实例可绑定的属性 __slots__ = ('name','age') def__init__(self,name): self.name = name # 声明一个子类 Cat,继承自 Animal classCat(Animal): pass # 新建一个实例(instance) dog = Dog('二哈') dog.name => '二哈' dog.age = 3 dog.age => 3 dog.father = '大二哈' => 报错 </code></pre> <ul> <li><strong>@property 装饰器:</strong> 把类中的一个方法变成属性,然后调用</li> </ul> <pre> <code class="language-python">classStudent(object): def__init__(self, name, idNumber): self.__name = name self.__idNumber = idNumber # 读取属性 name # 因为没有为 name 属性设置 setter,所以 name 属性只读 @property defname(self): return self.__name # 读取属性 idNumber @property defidNumber(self): return self.__idNumber # 修改属性 idNumber @idNumber.setter defidNumber(self, value): self.__idNumber = value s = Student('percy','20141111') s.name => 'percy' s.name = 'bob' => 报错 s.idNumber => '20141111' s.idNumber = '20143333' => '20143333' </code></pre> <ul> <li><strong>多重继承:</strong> 一个子类继承多个父类</li> </ul> <pre> <code class="language-python">classFather111(object): pass classFather222(object): pass classFather333(object): pass # 子类 Son 继承了 3 个父类 classSon(Father111, Father222, Father333): pass </code></pre> <ul> <li><strong>定制类:</strong> 通过为类定义一些特定的方法从而起到定制类的效果。</li> </ul> <pre> <code class="language-python">classStudent(object): # __init__ 用于初始化实例,类似其他语言的构造函数 def__init__(self, name): self.__name = name # __str__ 在给当前实例应用 str() 方法时调用 def__str__(self): print('你一定给当前实例调用了 str() 方法~') return 'some string' # __len__ 在给当前实例应用 len() 方法时调用 def__len__(self): print('你一定给当前实例调用了 len() 方法~') return 111 # __call__ 在把实例对象当成方法使用时调用 def__call__(self): print('你一定把当前实例当方法调用了~') p = Student('jack') # 自行运行查看效果 str(p) len(p) p() </code></pre> <p>以上。</p> <p> </p> <p>来自:http://blog.percymong.com/2017/03/22/python-OOP/</p> <p> </p>