面向对象是把构成问题的事务分解成各个对象,每个对象都有自己独立的属性和行为, 对象可以将整个问题事务进行分工, 不同的对象做不同的事情, 这种面向对象的编程思想由于更加贴近实际生活, 所以被计算机语言广泛应用。
> 常见的面向对象编程语言:Java / C++ / Python等等;
>Python中万事万物皆对象,而面向对象的三大特性:封装、继承和多态。
类的定义
Python 中定义一个类使用 class 关键字实现,其基本语法格式如下:
class 类名:
多个(≥0)类属性...
多个(≥0)类方法...
>注意,无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。
实例化对象
对已定义好的类进行实例化
定义类时,如果没有手动添加 `__init__()` 构造方法,又或者添加的 `__init__()` 中仅有一个 self 参数,则创建类对象时的参数可以省略不写
# 1.实例化对象
d1 = Dog()
d2 = Dog()
print(d1)
print(d2)
类变量
类变量指的是在类中,但在各个类方法外定义的变量。举个例子:
class Dog:
name: str="小花"
type: str="金毛"
age: int = 3
> 上述代码中,name和age都是类变量。类变量的特点是,所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用。
- 通过类名调用类变量和修改类变量的值:
# 使用类名直接调用
print(f"name={Dog.name},type={Dog.type},age={Dog.age}")
# 修改类变量的值
Dog.name="钱多多"
print(Dog.name)
- 通过类对象来调用所属类中的类变量:(**此方式不推荐使用**)
# 实例化对象
d1 = Dog()
# 获取对象中的属性
print(f"name={d1.name},age={d1.age}")
# 修改对象中的属性
d1.name="小黑"
d1.gender="公"
print(f"name={d1.name},gender={d1.gender}")
> **注意:通过类对象是无法修改类变量的。通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量**
函数和实例变量
实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。
class Dog:
name: str="小花"
type: str="金毛"
age: int = 3
def say(self):
pass
__init__()构造函数
在创建类时,我们可以手动添加一个 `__init__()` 方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)。
构造方法用于创建对象时使用,每当创建一个类的实例对象时,Python解释器都会自动调用它。Python类中,手动添加构造方法的语法格式如下:
def __init__(self,...):
代码块
> 注意,此方法的方法名中,开头和结尾各有 2 个下划线,且中间不能有空格。
定义类时,如果没有手动添加 `__init__()` 构造方法,又或者添加的 `__init__()` 中仅有一个 self 参数,则创建类对象时的参数可以省略不写,如下所示:
class Dog:
def __init__(self):
print("实例化")
d = Dog()
封装
简单的理解封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。
通过添加 __ 修饰符将变量声明为私有化属性。
class Dog:
name: str = '小黑'
age: int = 3
__sex: str = '公'
被修饰的变量无法再类的外部被访问,但是可以通过 self 对象来调用。
# 提供getter/setter
def get_sex(self):
return self.__sex
def set_sex(self, sex: str):
self.__sex = sex
d = Dog()
print(d.get_sex())
继承
Python 中,实现继承的类称为子类,被继承的类称为父类(也可称为基类、超类)。
子类继承父类时,只需在定义子类时,将父类(可以是多个)放在子类之后的圆括号里即可。语法格式如下:
class 类名(父类1, 父类2, ...):
#类定义部分
> 注意,如果该类没有显式指定继承自哪个类,则默认继承 object 类(object 类是 Python 中所有类的父类,即要么是直接父类,要么是间接父类)。另外,Python 的继承是多继承机制(和 C++一样),即一个子类可以同时拥有多个直接父类。
class Father(object):
height=180
money=100
def work(self):
print("会工作")
pass
class Mother(object):
fact='漂亮'
money=90
def cook(self):
print("会做饭")
pass
class Son(Father,Mother):
pass
# 创建son的实例
s=Son()
s.cook()
s.work()
print(s.fact)
print(s.height)
print(s.money)
> 同时继承 Father类和 Mother类时,Father类在前,当属性和方法重复时,越往前优先级越高。
查看继承关系
```python
print(Dog.__bases__)
print(Dog.__mro__)
多态
class Animal(object):
def play(self):
pass
class Tiger(Animal):
def play(self):
print("正在表演老虎后脚直立行走")
class Lion(Animal):
def play(self):
print("正在表演狮子跳火圈")
class Person(object):
def show(self, a: Animal):# 声明父类类型,传入子类类型
print("动物表演开始了")
a.play()# 多态