云计算百科
云计算领域专业知识百科平台

编程与数学 02-017 Python 面向对象编程 03课题、属性和方法

编程与数学 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 逻辑。

六、应用场景

  • 实例属性:存储对象状态(如 Person.name)。
  • 类属性:共享配置(如 Database.connection_timeout)。
  • 实例方法:定义对象行为(如 dog.bark())。
  • 类方法:工厂模式(如 Person.create_from_json())。
  • 静态方法:工具函数(如 MathUtils.add(a, b))。
  • @property:数据校验或计算属性(如 Circle.area)。
  • 通过灵活使用属性和方法,可以构建高内聚、低耦合的面向对象 Python 代码!

    全文总结

    本文围绕Python面向对象编程的核心概念展开,首先厘清属性类别:实例属性由对象独享,在__init__中用self初始化;类属性由类本身持有,所有实例共享,可直接修改。接着按调用方式将方法分为三类:实例方法以self操作对象数据;类方法用@classmethod以cls操作类状态,常用于工厂模式;静态方法用@staticmethod,是无状态的独立工具函数。随后介绍以双下划线包围的魔术方法,通过重载__add__、__str__等让对象支持+、print等原生语法。文章重点示范@property装饰器:把方法伪装成属性,实现getter、setter,可在访问时实时校验或计算,保障数据安全与接口一致。最后给出常见场景:用实例属性保存对象状态、类属性存放全局配置、类方法构造多态实例、静态方法提供数学工具、@property完成动态计算与边界校验。掌握这些机制,开发者即可写出结构清晰、可扩展、易维护的Python面向对象代码。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 编程与数学 02-017 Python 面向对象编程 03课题、属性和方法
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!