python实例属性管理

在python中,需要对某个实例attribute增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。下面通过两种方法进行实现。(具体参考《python cookbook》)

# -*- coding:utf-8 -*-

#getter和setter主要用于实例属性的检测

#以下是通过类的方式实现的实例属性的检测,
#但是如果有很多属性需要检测,则将实现很多冗余的代码。
#因此可以通过第二种方法进行解决。
class NameAge:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise TypeError("name must be a string")
        else:
            self._name = value

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            raise TypeError("age must be a int")
        else:
            self._age = value


#第二种方法
def typed_property(name, expected_type):
    storage_name = '%s%s' %('_', name)

    @property
    def proper(self):
        return getattr(self, storage_name)

    @proper.setter
    def proper(self, value):
        if not isinstance(value, expected_type):
            raise TypeError("{0} must be a {1}".format(name, expected_type))
        else:
            setattr(self, storage_name, value)

    return proper

class NameAge2:
    name = typed_property('name', str)
    age = typed_property('age', int)

    def __init__(self, name, age):
        self.name = name
        self.age = age


def main():
    obj1 = NameAge("alice", 10)
    print("Obj1 -> name: {0} age: {1}".format(obj1.name, obj1.age))
    obj1.name = "david"
    obj1.age = 20
    print("Obj1 -> name: {0} age: {1}".format(obj1.name, obj1.age))
    #异常
    #obj1.name = 10

    obj2 = NameAge2("alex", 11)
    print("Obj2 -> name: {0} age: {1}".format(obj2.name, obj2.age))
    obj2.name = "bob"
    obj2.age = 13
    print("Obj2 -> name: {0} age: {1}".format(obj2.name, obj2.age))
    #异常
    #obj2.age = 'tila'

if __name__ == "__main__":
    main()

运行结果:

Obj1 -> name: alice age: 10
Obj1 -> name: david age: 20
Obj2 -> name: alex age: 11
Obj2 -> name: bob age: 13

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我会用文和 Python 实例代码来帮助你理解类。 类是一种抽象的数据类型,用于描述一类相似的对象的共同特征和行为。类是面向对象编程的基础,是对象的蓝图。 下面是一个 Python 类的示例: ``` class Student: def __init__(self, name, age, grade): self.name = name self.age = age self.grade = grade def get_name(self): return self.name def get_age(self): return self.age def get_grade(self): return self.grade def set_grade(self, grade): self.grade = grade ``` 在这个例子,我们定义了一个名为 `Student` 的类,该类有三个属性:`name`,`age` 和 `grade`。它还有四个方法:`__init__`、`get_name`、`get_age` 和 `get_grade`。 `__init__` 方法是类的构造函数,用于在创建类的实例时初始化类的属性。其他三个方法分别用于获取类的属性值和修改类的属性值。 要使用这个类,我们可以这样创建类的实例: ``` student1 = Student("Tom", 16, 95) student2 = Student("Jerry", 17, 90) ``` 然后,我们就可以使用这些实例来调用类的方法,获取和修改类的属性值: ``` print(student1.get_name()) # Tom print(student2.get_age()) # 17 student2.set_grade(100) print(student2.get_grade()) # 100 ``` 希望这些信 ### 回答2: 类是面向对象编程的重要概念,是一种自定义的数据类型。它可以通过定义属性和方法,将相关的数据和操作封装在一起,实现代码的重用性和扩展性。 下面是一个用Python实例代码来理解类的案例: ```python class Car: def __init__(self, brand, model, color): self.brand = brand self.model = model self.color = color self.speed = 0 def accelerate(self, acceleration): self.speed += acceleration def brake(self, deceleration): if self.speed > deceleration: self.speed -= deceleration else: self.speed = 0 def display_info(self): print("Brand:", self.brand) print("Model:", self.model) print("Color:", self.color) print("Speed:", self.speed) # 创建Car类的实例 car = Car("Toyota", "Camry", "Red") car.display_info() # 打印初始信息 # 对实例car进行加速和刹车操作 car.accelerate(20) car.brake(10) car.display_info() # 打印加速和刹车后的信息 ``` 在上面的例子,我们定义了一个名为Car的类,它具有品牌、型号、颜色和速度等属性。类的`__init__`方法是构造方法,在创建实例时会被调用。`accelerate`和`brake`方法分别用于加速和刹车操作。`display_info`方法用于显示车辆的信息。 通过创建Car类的实例`car`,我们可以调用实例的方法对车辆进行加速和刹车操作,并通过`display_info`方法显示车辆的信息。 这个例子展示了类的封装、属性和方法的定义与使用。类将相关的属性和方法组织在一起,方便管理和操作。使用类可以提高代码的可读性、可维护性和复用性。 ### 回答3: 类是面向对象编程的一个重要概念,它可以理解为对一类具有相似属性和行为的对象的抽象描述。在Python,我们可以使用class关键字来定义类。 下面我用一个简单的例子来帮助理解类的概念。我们来定义一个名为"Student"的类,表示学生对象。在这个类,我们定义了两个属性name和age,以及两个方法get_name和get_age分别用于获取学生的姓名和年龄: ```python class Student: def __init__(self, name, age): self.name = name self.age = age def get_name(self): return self.name def get_age(self): return self.age ``` 在上面的代码,我们使用__init__方法作为构造函数,用于初始化学生对象的属性name和age。self代表类的实例对象,可以用来访问类的属性和方法。 接下来,我们可以实例化一个Student对象,并通过调用get_name和get_age方法来获取学生的姓名和年龄: ```python student = Student("张三", 18) print(student.get_name()) # 输出:张三 print(student.get_age()) # 输出:18 ``` 通过上面的例子,我们可以看到类的定义和实例化的过程。类提供了一种封装数据和行为的方式,使得我们可以方便地创建和管理对象。 此外,类还可以继承和多态等特性,用于实现更复杂的程序结构。通过合理应用类的概念,我们可以提高代码的可读性、可维护性和复用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值