Python成员属性案例如何定义属性

wen python案例 26

本文目录导读:

Python成员属性案例如何定义属性

  1. 直接定义实例属性(最常用)
  2. 使用@property装饰器(属性访问控制)
  3. 类属性(所有实例共享)
  4. 使用slots限制属性(优化内存)
  5. 动态属性(getattrsetattr
  6. 完整示例(综合应用)

在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

动态属性(getattrsetattr

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

最佳实践总结:

  1. 普通属性:直接用self.属性名定义
  2. 需要验证:使用@property装饰器
  3. 共享数据:使用类属性
  4. 性能优化:使用__slots__
  5. 动态需求:使用__getattr____setattr__

抱歉,评论功能暂时关闭!