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'