python 模块和包、类和对象
模块
模块是包含 Python 代码的文件,通常用于组织相关的函数、类和其他语句。模块可以被导入并在其他 Python 文件中使用。
创建模块
假设你创建了一个名为 mymodule.py 的文件,内容如下:
# mymodule.py
def greet(name):
return f"你好, {name}!"
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
return f"我的名字是 {self.name},我今年 {self.age} 岁。"
导入模块
在另一个 Python 文件中,你可以这样导入并使用这个模块:
import mymodule
# 使用模块中的函数
print(mymodule.greet("Alice")) # 输出: 你好, Alice!
# 使用模块中的类
person = mymodule.Person("Bob", 25)
print(person.introduce()) # 输出: 我的名字是 Bob,我今年 25 岁。
从模块中导入特定对象
你也可以只导入模块中的特定函数或类:
from mymodule import greet, Person
print(greet("Alice")) # 输出: 你好, Alice!
person = Person("Bob", 25)
print(person.introduce()) # 输出: 我的名字是 Bob,我今年 25 岁。
别名
你可以为导入的模块或对象指定别名:
import mymodule as mm
print(mm.greet("Alice")) # 输出: 你好, Alice!
from mymodule import Person as P
person = P("Bob", 25)
print(person.introduce()) # 输出: 我的名字是 Bob,我今年 25 岁。
包
包是一个包含多个模块的目录,并且该目录下有一个特殊的 __init__.py 文件。__init__.py 可以为空,但它的存在表示该目录是一个包。
创建包
假设你创建了一个名为 mypackage 的目录,结构如下:
mypackage/
__init__.py
module1.py
module2.py
module1.py 内容:
# module1.py
def func1():
return "这是来自 module1"
module2.py 内容:
# module2.py
def func2():
return "这是来自 module2"
__init__.py 可以为空,或者可以用来初始化包的内容:
# __init__.py
from .module1 import func1
from .module2 import func2
导入包
在另一个 Python 文件中,你可以这样导入并使用这个包:
import mypackage
print(mypackage.func1()) # 输出: 这是来自 module1
print(mypackage.func2()) # 输出: 这是来自 module2
从包中导入模块
你也可以直接从包中导入模块:
from mypackage import module1, module2
print(module1.func1()) # 输出: 这是来自 module1
print(module2.func2()) # 输出: 这是来自 module2
类和对象
类 (Classes)
类是一种用户定义的数据类型,它封装了数据(属性)和方法(行为)。类是面向对象编程的基础。
定义类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
return f"我的名字是 {self.name},我今年 {self.age} 岁。"
def get_age(self):
return self.age
def set_age(self, new_age):
if new_age > 0:
self.age = new_age
else:
print("年龄必须是正数。")
创建对象
person1 = Person("Alice", 30)
print(person1.introduce()) # 输出: 我的名字是 Alice,我今年 30 岁。
person2 = Person("Bob", 25)
print(person2.introduce()) # 输出: 我的名字是 Bob,我今年 25 岁。
访问属性和方法
print(person1.name) # 输出: Alice
print(person1.get_age()) # 输出: 30
person1.set_age(35)
print(person1.get_age()) # 输出: 35
person1.set_age(-10) # 输出: 年龄必须是正数。
继承
继承允许一个类继承另一个类的属性和方法。
定义子类
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def study(self):
return f"{self.name} 正在学习。"
def introduce(self):
return f"我的名字是 {self.name},我今年 {self.age} 岁,我的学号是 {self.student_id}。"
创建子类对象
student1 = Student("Charlie", 20, "S12345")
print(student1.introduce()) # 输出: 我的名字是 Charlie,我今年 20 岁,我的学号是 S12345。
print(student1.study()) # 输出: Charlie 正在学习。
多态 (Polymorphism)
多态允许不同类的对象通过相同的接口进行调用,表现出不同的行为。
示例
class Teacher(Person):
def __init__(self, name, age, subject):
super().__init__(name, age)
self.subject = subject
def teach(self):
return f"{self.name} 正在教 {self.subject}。"
def introduce(self):
return f"我的名字是 {self.name},我今年 {self.age} 岁,我教 {self.subject}。"
def introduce_person(person):
print(person.introduce())
# 创建不同类型的对象
person1 = Person("Alice", 30)
student1 = Student("Charlie", 20, "S12345")
teacher1 = Teacher("David", 40, "数学")
# 调用相同的方法,表现出不同的行为
introduce_person(person1) # 输出: 我的名字是 Alice,我今年 30 岁。
introduce_person(student1) # 输出: 我的名字是 Charlie,我今年 20 岁,我的学号是 S12345。
introduce_person(teacher1) # 输出: 我的名字是 David,我今年 40 岁,我教 数学。
总结
模块 是包含相关功能的 Python 文件。
包 是包含多个模块的目录,通常用于组织大型项目。
类 是一种用户定义的数据类型,封装了数据和方法。
对象 是类的实例。
继承 允许一个类继承另一个类的属性和方法。
多态 允许不同类的对象通过相同的接口进行调用,表现出不同的行为。