Python 面向对象编程

wanxingdai 2年前
   <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>