本文目录导读:

在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__
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播