本文目录导读:

在Python中,定义成员属性有多种方式,让我为你详细介绍:
直接定义实例属性(最常用)
class Person:
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
def introduce(self):
print(f"我叫{self.name},今年{self.age}岁")
# 使用
p = Person("张三", 25)
print(p.name) # 输出:张三
p.introduce() # 输出:我叫张三,今年25岁
使用@property装饰器(属性访问控制)
class Student:
def __init__(self, name, score):
self._name = name
self._score = score
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if not isinstance(value, str):
raise ValueError("姓名必须是字符串")
self._name = value
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not (0 <= value <= 100):
raise ValueError("成绩必须在0-100之间")
self._score = value
# 使用
s = Student("李四", 85)
print(s.name) # 调用getter
s.score = 95 # 调用setter
# s.score = 150 # 会抛出异常
类属性(所有实例共享)
class Employee:
# 类属性
company = "ABC公司"
employee_count = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.employee_count += 1
@classmethod
def get_employee_count(cls):
return cls.employee_count
# 使用
e1 = Employee("王五", 10000)
e2 = Employee("赵六", 12000)
print(Employee.company) # 输出:ABC公司
print(e1.company) # 输出:ABC公司
print(Employee.employee_count) # 输出:2
使用slots限制属性(优化内存)
class Point:
__slots__ = ['x', 'y'] # 只允许这两个属性
def __init__(self, x, y):
self.x = x
self.y = y
def distance(self):
return (self.x**2 + self.y**2) ** 0.5
# 使用
p = Point(3, 4)
print(p.x, p.y) # 输出:3 4
print(p.distance()) # 输出:5.0
# p.z = 10 # 会抛出AttributeError
动态属性(getattr和setattr)
class DynamicAttributes:
def __init__(self):
self._data = {}
def __getattr__(self, name):
if name in self._data:
return self._data[name]
raise AttributeError(f"没有属性'{name}'")
def __setattr__(self, name, value):
if name == '_data':
super().__setattr__(name, value)
else:
self._data[name] = value
# 使用
d = DynamicAttributes()
d.name = "小明"
d.age = 20
print(d.name) # 输出:小明
print(d.age) # 输出:20
完整示例(综合应用)
class BankAccount:
# 类属性
bank_name = "中国银行"
interest_rate = 0.035
def __init__(self, account_id, owner, balance=0):
self._account_id = account_id
self._owner = owner
self._balance = balance
self._transactions = []
# 只读属性
@property
def account_id(self):
return self._account_id
@property
def owner(self):
return self._owner
# 带验证的属性
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, value):
if value < 0:
raise ValueError("余额不能为负数")
self._balance = value
# 业务方法
def deposit(self, amount):
if amount <= 0:
raise ValueError("存款金额必须大于0")
self._balance += amount
self._transactions.append(f"存款:+{amount}")
def withdraw(self, amount):
if amount <= 0:
raise ValueError("取款金额必须大于0")
if amount > self._balance:
raise ValueError("余额不足")
self._balance -= amount
self._transactions.append(f"取款:-{amount}")
@property
def transaction_history(self):
return self._transactions.copy()
@classmethod
def set_interest_rate(cls, rate):
if not (0 <= rate <= 1):
raise ValueError("利率必须在0-1之间")
cls.interest_rate = rate
# 使用
account = BankAccount("1001", "张三", 1000)
account.deposit(500)
account.withdraw(200)
print(f"账户余额:{account.balance}") # 输出:1300
print(f"交易记录:{account.transaction_history}")
# 修改类属性
BankAccount.set_interest_rate(0.04)
print(f"当前利率:{BankAccount.interest_rate}") # 输出:0.04
最佳实践总结:
- 普通属性:直接用
self.属性名定义 - 需要验证:使用
@property装饰器 - 共享数据:使用类属性
- 性能优化:使用
__slots__ - 动态需求:使用
__getattr__和__setattr__