编程与数学 02-017 Python 面向对象编程 03课题、属性和方法
- 一、属性(Attributes)
-
-
- 定义
- (1) 实例属性
- (2) 类属性
- (3) 动态添加属性
- (4) 属性访问控制
-
- 二、方法(Methods)
-
-
- 定义
- (1) 实例方法
- (2) 类方法(`@classmethod`)
- (3) 静态方法(`@staticmethod`)
- 对比总结
-
- 三、特殊方法(魔术方法)
-
-
- (1) 常用魔术方法
- (2) 示例
-
- 四、属性装饰器(`@property`)
-
-
- (1) 基本用法
- (2) 用途
-
- 五、概念总结
- 六、应用场景
- 全文总结
摘要:本文系统讲解Python面向对象编程中的属性与方法:区分实例属性与类属性,介绍实例、类、静态方法及魔术方法,展示@property实现属性控制与数据验证,并给出典型应用场景,帮助开发者构建高内聚低耦合的代码。
关键词:Python、面向对象、实例属性、类属性、实例方法、类方法、静态方法、魔术方法、@property、数据验证
人工智能助手:Kimi
一、属性(Attributes)
定义
属性是存储在对象或类中的数据,表示对象的状态。分为:
- 实例属性:属于特定对象。
- 类属性:属于类本身,所有实例共享。
(1) 实例属性
通过 self 在 __init__ 方法中初始化,每个对象独享一份。
class Dog:
def __init__(self, name):
self.name = name # 实例属性
dog1 = Dog("Buddy")
dog2 = Dog("Max")
print(dog1.name) # 输出: Buddy
print(dog2.name) # 输出: Max (实例属性互不影响)
(2) 类属性
在类内部直接定义,所有实例共享。
class Dog:
species = "Canis familiaris" # 类属性
def __init__(self, name):
self.name = name
dog1 = Dog("Buddy")
dog2 = Dog("Max")
print(dog1.species) # 输出: Canis familiaris
print(dog2.species) # 输出: Canis familiaris (共享类属性)
(3) 动态添加属性
Python 允许在运行时动态添加属性。
dog1.age = 3 # 动态添加实例属性
Dog.color = "brown" # 动态添加类属性
(4) 属性访问控制
- 公有属性:直接访问(如 obj.attr)。
- “私有”属性:约定用 _ 或 __ 前缀(非强制)。
class MyClass:
def __init__(self):
self._protected = 123 # 提示受保护(约定)
self.__private = 456 # 名称修饰(实际变为 _MyClass__private)
obj = MyClass()
print(obj._protected) # 可以访问(但约定不推荐)
print(obj.__private) # 报错!实际需访问 obj._MyClass__private
二、方法(Methods)
定义
方法是定义在类中的函数,用于描述对象的行为。分为:
- 实例方法:操作实例数据。
- 类方法:操作类属性。
- 静态方法:与类无关的工具函数。
(1) 实例方法
第一个参数为 self,指向调用该方法的实例。
class Dog:
def __init__(self, name):
self.name = name
def bark(self): # 实例方法
print(f"{self.name} says woof!")
dog = Dog("Buddy")
dog.bark() # 输出: Buddy says woof!
(2) 类方法(@classmethod)
- 第一个参数为 cls,指向类本身。
- 用于修改类状态或创建工厂方法。
class Dog:
species = "Canis familiaris"
@classmethod
def get_species(cls):
return cls.species
print(Dog.get_species()) # 输出: Canis familiaris
(3) 静态方法(@staticmethod)
无 self 或 cls 参数,仅是类的工具函数。
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(2, 3)) # 输出: 5
对比总结
实例方法 | 无 | self | 操作实例数据 |
类方法 | @classmethod | cls | 操作类属性或工厂方法 |
静态方法 | @staticmethod | 无 | 独立工具函数 |
三、特殊方法(魔术方法)
以双下划线 __ 包围的方法,用于重载操作符或定义对象行为。
(1) 常用魔术方法
__init__(self, …) | 构造方法 | obj = ClassName() |
__str__(self) | 定义 print(obj) 的输出 | print(obj) |
__len__(self) | 定义 len(obj) 的行为 | len(obj) |
__add__(self, other) | 重载 + 操作符 | obj1 + obj2 |
(2) 示例
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other): # 重载 +
return Vector(self.x + other.x, self.y + other.y)
def __str__(self): # 定义打印格式
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # 输出: Vector(4, 6)
四、属性装饰器(@property)
将方法伪装成属性,用于控制属性访问。
(1) 基本用法
class Circle:
def __init__(self, radius):
self._radius = radius # 保护属性
@property
def radius(self): # 获取属性
return self._radius
@radius.setter
def radius(self, value): # 设置属性
if value < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
@property
def area(self): # 只读属性
return 3.14 * self._radius 2
c = Circle(5)
print(c.radius) # 输出: 5 (像属性一样调用方法)
c.radius = 10 # 调用 setter
print(c.area) # 输出: 314.0 (只读)
(2) 用途
- 数据验证(如限制 radius 不能为负)。
- 动态计算属性(如 area 基于 radius 实时计算)。
- 向后兼容(将方法改为属性不影响现有代码)。
五、概念总结
实例属性 | 每个对象独有的数据,通过 self.attr 定义。 |
类属性 | 所有对象共享的数据,直接定义在类中。 |
实例方法 | 操作实例数据,第一个参数为 self。 |
类方法 | 操作类属性,用 @classmethod 装饰,参数为 cls。 |
静态方法 | 独立工具函数,用 @staticmethod 装饰,无 self 或 cls。 |
魔术方法 | 双下划线方法(如 __init__),重载内置行为。 |
@property | 将方法伪装成属性,支持 getter/setter 逻辑。 |
六、应用场景
通过灵活使用属性和方法,可以构建高内聚、低耦合的面向对象 Python 代码!
全文总结
本文围绕Python面向对象编程的核心概念展开,首先厘清属性类别:实例属性由对象独享,在__init__中用self初始化;类属性由类本身持有,所有实例共享,可直接修改。接着按调用方式将方法分为三类:实例方法以self操作对象数据;类方法用@classmethod以cls操作类状态,常用于工厂模式;静态方法用@staticmethod,是无状态的独立工具函数。随后介绍以双下划线包围的魔术方法,通过重载__add__、__str__等让对象支持+、print等原生语法。文章重点示范@property装饰器:把方法伪装成属性,实现getter、setter,可在访问时实时校验或计算,保障数据安全与接口一致。最后给出常见场景:用实例属性保存对象状态、类属性存放全局配置、类方法构造多态实例、静态方法提供数学工具、@property完成动态计算与边界校验。掌握这些机制,开发者即可写出结构清晰、可扩展、易维护的Python面向对象代码。
评论前必须登录!
注册