2.2. 面向对象编程

面向对象编程(OOP)是一种程序设计思想,把对象作为程序的基本单元,一个对象包含数据和操作数据的函数。

2.2.1. 类demo

class Student(object):
   def __init__(self,name,age):
      self.name=name
      self.age =age
   def print_info(self):
      print("{}:{}".format(self.name,self.age))

2.2.2. 类和实例

Student是类, 通过Student()创建的是一个实例。 各个实例是互相独立的,

2.2.3. 访问限制

可以通过将类的属性变量修改为__(2个下划线)开头即可。

2.2.4. 继承和多态

继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。

动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    pass 
class Pig(Animal):
    pass 

dog = Dog()
dog.run()


class Dog2(Animal):
    def run(self):
        print('Dog2 is running...')
class Pig2(Animal):
    def run(self):
        print('Pig2 is running...')


def do_run(animal):
    if not isinstance(animal,Animal):
        return 
    animal.run()

a = Animal()
dog2 = Dog2()
pig2 = Pig2()
do_run(a)
do_run(dog2)
do_run(pig2)
dog2.run()
pig2.run()

2.2.5. 获取对象类型信息

对象类型,使用type()函数,对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数。

In [2]: type(123)
Out[2]: int


In [6]: def f():pass

In [7]: type(f) == types.FunctionType
Out[7]: True


In [8]: isinstance([1, 2, 3], (list, tuple))
Out[8]: True

In [9]: dir ("ABC")

2.2.6. 获取对象属性和方法信息

如果要获得一个对象的所有属性和方法,可以使用dir()函数, 配合 getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态。

In [9]: dir ("ABC")


In [10]: class Dog():
 ...:     def __len__(self): return 100


   In [11]: dog = Dog()

   In [12]: len(dog)
   Out[12]: 100
   In [13]: dog.__len__()
   Out[13]: 100

   In [14]: dog.age
   ---------------------------------------------------------------------------
   AttributeError                            Traceback (most recent call last)
   Cell In[14], line 1
   ----> 1 dog.age

   AttributeError: 'Dog' object has no attribute 'age'

   In [15]: hasattr(dog,"age"
      ...: )
   Out[15]: False

   In [16]: setattr(dog,"age",1)

   In [17]: hasattr(dog,"age")
   Out[17]: True

   In [18]: getattr(dog,"age")
   Out[18]: 1

2.2.7. 实例属性和类属性

实例属性是归属实例的, 类属性是属于类的, 可以通过类对象的属性获取,也可以通过类的属性获取。

In [3]:    class Student(object):
   ...:       school = "zhengzhou ergao"
   ...:       def __init__(self, name):
   ...:          self.name = name
   ...:

In [4]: s = Student("zhang")

In [5]: s.school
Out[5]: 'zhengzhou ergao'

In [6]: s.name
Out[6]: 'zhang'
In [7]: Student.school
Out[7]: 'zhengzhou ergao'