引言

python小程序之对象的属性操作

一、对象的属性操作

1.1 题目

给对象添加属性

1.2 代码

class Cat:
 # 在缩进中书写⽅法
    def eat(self):
        # self 会⾃动出现,暂不管
        print(f'{id(self)}, self')
        print(f'⼩猫{self.name}, 爱吃⻥...')
# 2. 创建对象


blue_cat = Cat()
print(f'{id(blue_cat)}, blue_cat')
# 给 蓝猫添加 name 属性
blue_cat.name = '蓝猫'
# 3. 通过对象调⽤类中的⽅法
blue_cat.eat()
# blue_cat 对象调⽤ eat ⽅法, 解释器就会将 blue_cat 对象传给 self
print('_*_' * 30)
# # 创建对象
black_cat = Cat()
black_cat.name = '⿊猫'
print(f"{id(black_cat)}, black_cat")
black_cat.eat()
# black_cat 对象调⽤ eat ⽅法, 解释器就会将 black_cat 对象传给 self

输出结果:
在这里插入图片描述

1.3 代码解释

这段代码定义了一个 Cat 类,并创建了两个 Cat 对象:blue_catblack_cat。然后,为这两个对象分别添加了 name 属性,并调用了它们的 eat 方法

1.3.1 类定义

class Cat:
    # 在缩进中书写方法
    def eat(self):
        # self 会自动出现, 暂不管
        print(f'{id(self)}, self')
        print(f'小猫{self.name}, 爱吃鱼...')
  • 类名Cat
  • 方法
    • eat(self): 这是一个实例方法,它接受一个参数 self,这个参数代表调用该方法的对象本身
    • eat 方法内部,首先打印出 self 对象的内存地址(使用 id(self) 获取)
    • 然后打印一条消息,显示小猫的名字和它喜欢吃的食物。这里假设每个 Cat 对象都有一个 name 属性

1.3.2 创建对象并调用方法

# 创建第一个对象
blue_cat = Cat()
print(f'{id(blue_cat)}, blue_cat')

# 给蓝猫添加 name 属性
blue_cat.name = '蓝猫'

# 通过对象调用类中的方法
blue_cat.eat()

# 打印分隔符
print('_*_' * 30)

# 创建第二个对象
black_cat = Cat()
black_cat.name = '黑猫'
print(f"{id(black_cat)}, black_cat")

# 调用 eat 方法
black_cat.eat()

1.3.3 详细步骤解释

  1. 创建第一个 Cat 对象 blue_cat:

    blue_cat = Cat()
    
    • 这行代码创建了一个 Cat 类的新实例,并将其赋值给变量 blue_cat
  2. 打印 blue_cat 的内存地址:

    print(f'{id(blue_cat)}, blue_cat')
    
    • 使用 id() 函数获取 blue_cat 对象的内存地址,并打印出来
  3. blue_cat 添加 name 属性:

    blue_cat.name = '蓝猫'
    
    • blue_cat 对象动态地添加了一个 name 属性,并设置其值为 '蓝猫'
  4. 调用 blue_cateat 方法:

    blue_cat.eat()
    
    • 当调用 eat 方法时,Python 会自动将 blue_cat 作为 self 参数传递给 eat 方法
    • 因此,eat 方法中的 self 就是 blue_cat 对象,可以访问到 blue_catname 属性
  5. 打印分隔符:

    print('_*_' * 30)
    
    • 这行代码用于在输出中添加一个分隔符,以区分不同的对象。
  6. 创建第二个 Cat 对象 black_cat:

    black_cat = Cat()
    black_cat.name = '黑猫'
    print(f"{id(black_cat)}, black_cat")
    
    • 同样地,创建了一个新的 Cat 实例 black_cat,并为其添加 name 属性,设置为 '黑猫'
    • 打印 black_cat 的内存地址。
  7. 调用 black_cateat 方法:

    black_cat.eat()
    
    • 调用 black_cateat 方法,此时 selfblack_cat 对象

<blue_cat的内存地址><black_cat的内存地址> 会是实际的内存地址数字。每次运行程序时,这些内存地址可能会不同,因为对象被分配到的内存位置可能不同。

二、思考

在python中,对象的属性操作主要包括添加、获取、设置和删除属性。这些操作可以通过直接访问属性名来完成,也可以通过内置函数或特殊方法来进行更复杂的控制

2.1 添加属性

对象.属性名 = 属性值

2.1.1 类内部添加

在内部⽅法中, self 是对象,
self.属性名 = 属性值

在类中添加属性⼀般写在 init ⽅法中

2.1.2 类外部添加

对象.属性名 = 属性值 (⼀般不使用)

2.2 获取属性

要获取对象的属性,可以直接使用点.操作符

# 假设我们有一个类定义如下:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
# 创建一个Person实例
p = Person("Alice", 30)
# 获取属性
print(p.name)  # 输出: Alice
print(p.age)   # 输出: 30

2.3 设置属性

设置属性也是通过点.操作符进行的

# 继续上面的例子
p.name = "Bob"  # 修改name属性
p.age = 25      # 修改age属性
print(p.name)  # 输出: Bob
print(p.age)   # 输出: 25

2.4 删除属性

可以使用del语句来删除对象的属性

# 删除name属性
del p.name
# 尝试打印name会引发AttributeError
# print(p.name)  # 这行代码会抛出异常:AttributeError: 'Person' object has no attribute 'name'

2.5 使用内置函数操作属性

  • getattr(obj, name[, default]): 获取对象的属性值,如果属性不存在且没有提供默认值,则抛出AttributeError
  • setattr(obj, name, value): 设置对象的属性值
  • hasattr(obj, name): 检查对象是否具有指定的属性
  • delattr(obj, name): 删除对象的属性
# 使用getattr和setattr
print(getattr(p, 'age'))  # 输出: 25
setattr(p, 'age', 26)
print(getattr(p, 'age'))  # 输出: 26
# 使用hasattr检查属性是否存在
print(hasattr(p, 'age'))  # 输出: True
print(hasattr(p, 'address'))  # 输出: False
# 使用delattr删除属性
delattr(p, 'age')
# print(p.age)  # 这行代码会抛出异常:AttributeError: 'Person' object has no attribute 'age'

2.6 特殊方法

  • __getattr__(self, name): 当试图访问不存在的属性时被调用
  • __setattr__(self, name, value): 当试图设置属性值时被调用
  • __delattr__(self, name): 当试图删除属性时被调用

这些特殊方法允许你在属性访问过程中执行自定义逻辑。例如,可以在__setattr__中添加日志记录或数据验证

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __setattr__(self, name, value):
        if name == 'age' and (not isinstance(value, int) or value < 0):
            raise ValueError("Age must be a non-negative integer")
        super().__setattr__(name, value)

p = Person("Alice", 30)
p.age = 25  # 正常工作
# p.age = -1  # 抛出ValueError: Age must be a non-negative integer

通过以上方式,可以灵活地对对象的属性进行各种操作,并根据需要实现特定的行为

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐