1. OOP核心
面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的编程范式,旨在通过将程序划分为对象来提高代码的可重用性和可维护性。OOP的核心思想是将数据和操作数据的方法封装到一个对象中,从而使得程序更加模块化和易于理解。
OOP的核心概念:
封装:封装指的是将数据和方法封装到一个对象中,使其成为一个独立的实体
继承:继承允许一个对象继承另一个对象的属性和方法,从而实现代码的重用
多态:多态允许不同的对象对同一方法做出不同的响应,增加了代码的灵活性和可扩展性
2. OOP的基础——类与对象
2.1 类
2.1.1创建
在Python中,可以使用class关键字来创建一个类。类是一个对象的蓝图,它定义了该对象的属性和方法。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
在上面的例子中,我们创建了一个名为Person的类。该类有两个属性:name和age。它还有一个方法say_hello,用于打印出个人信息。
2.1.2 类属性
2.2 对象
2.2.1 class对象
类对象支持两种操作:属性引用和实例化。
属性引用:一般的形式为(类名.属性)。通过这种方式可以引用Class类中的有效属性。
实例化:将类视为一个不带有返回值的函数,将其赋予一个新的参数。
例:
class Person:
name = "John"
person = Person()
print(Person.name) # 输出: John
print(person.name) # 输出: John
2.2.2 实例对象
通俗而言,类实例化形成的对象被称为实例对象。
对于实例对象而言,可以理解的操作只有属性引用。其中属性分为两种:数据属性,方法。通过实例对象,我们可以在类的外部调用类中的属性进行运算。
class Person:
name = "John"
def age():
print age
person = Person()
person.name #数据属性
person.age() #方法
2.2.3 方法对象
一般而言,类在实例化后类方法就会与实例化对象绑定,可以通过赋值的方式将类方法绑定给其他的对象
class Person:
name = "John"
def age():
person = Person()
student_age = person.age() #方法对象
#student_age使用时相当于person类中的age方法
2.2.4 类和实例变量
一般来说,实例变量用于每个实例的唯一数据,而类变量用于类的所有实例共享的属性和方法:
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # shared by all dogs
'canine'
>>> e.kind # shared by all dogs
'canine'
>>> d.name # unique to d
'Fido'
>>> e.name # unique to e
'Buddy'
在上述例子中,Dog的数值属性(kind)由d、e共享,而通过实例化输入的属性(Fido、Buddy)则为私有,对于d和e是唯一确定的。
注:__init__是python中特殊的初始化方法。
3. 继承
在python的继承中,我们将类分为两种,一种被称之为子类,另一种被称之为父类(基类)。子类继承了父类的所有属性和方法,并且可以在不修改父类的情况下添加新的属性和方法。这种继承关系使得代码更加灵活和可维护。
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
在Python中,定义一个派生类时,需要指定一个基类。基类是派生类的直接父类,派生类会继承基类的属性和方法。在定义派生类时,需要确保基类的名称在当前作用域中是可见的,否则会出现NameError。
基类的名称可以是在当前作用域中定义的类的名称,也可以是通过其他任意表达式计算得到的。这意味着,不仅可以在当前模块中定义基类,还可以在其他模块中定义基类,并在派生类所在的模块中使用该基类。
class DerivedClassName(modname.BaseClassName):
Python有两个内置函数可被用于继承机制:
-
使用 isinstance() 来检查一个实例的类型:
isinstance(obj, int)
仅会在obj.__class__
为 int 或某个派生自 int 的类时为True
。 -
使用 issubclass() 来检查类的继承关系:
issubclass(bool, int)
为True
,因为 bool 是 int 的子类。 但是,issubclass(float, int)
为False
,因为 float 不是 int 的子类。
多重继承
class DerivedClassName(BaseClassName1, BaseClassName2, BaseClassName3):
<statement-1>
.
.
.
<statement-N>
对于多数目的来说,在最简单的情况下,你可以认为搜索从父类所继承属性的操作是深度优先、从左到右的,当层次结构存在重叠时不会在同一个类中搜索两次。 因此,如果某个属性在 DerivedClassName
中找不到,就会在 Base1
中搜索它,然后(递归地)在 Base1
的基类中搜索,如果在那里也找不到,就将在 Base2
中搜索,依此类推。
4. 私有变量
那种仅限从一个对象内部访问的“私有”实例变量在 Python 中并不存在。 但是,大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如 _spam
) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。 这应当被视为一个实现细节,可能不经通知即加以改变。
例:
class MyClass:
def __init__(self):
self.__private_var = 0 # 私有变量
def get_private_var(self):
return self.__private_var
def set_private_var(self, value):
self.__private_var = value
obj = MyClass()
print(obj.get_private_var()) # 输出: 0
obj.set_private_var(10)
print(obj.get_private_var()) # 输出: 10
print(obj.__private_var) # 报错,无法直接访问私有变量
5. Python生态
Python生态是指与Python相关的一系列软件包、库、工具和框架的集合,用于支持Python编程语言的开发和应用。Python生态包括但不限于以下内容:
-
Python标准库:Python自带的一组基础库,提供了丰富的功能和工具,如文件操作、网络通信、数据处理等。
-
第三方库:由Python社区开发的各种功能强大、易用的库,如NumPy、Pandas、Matplotlib、TensorFlow等,用于科学计算、数据分析、机器学习等领域。
-
开发工具:包括集成开发环境(IDE)如PyCharm、Spyder、Jupyter Notebook等,以及编辑器、调试器、版本控制等工具,用于提高开发效率和代码质量。
-
框架:Python生态中的框架主要用于web开发,如Django、Flask、Tornado等,提供了快速构建、高效运行的web应用的能力。
-
数据库:Python生态中有多种支持Python的数据库,如MySQL、SQLite、MongoDB等,用于数据存储和管理。
-
扩展模块:Python生态还包括各种与其他语言交互的扩展模块,如Cython、PyQt、PyGame等,用于扩展Python的功能和性能。