【python实操】python小程序之对象的属性操作(包括添加、获取、设置和删除属性)
python小程序之对象的属性操作(包括添加、获取、设置和删除属性)
引言
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_cat
和 black_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 详细步骤解释
-
创建第一个
Cat
对象blue_cat
:blue_cat = Cat()
- 这行代码创建了一个
Cat
类的新实例,并将其赋值给变量blue_cat
- 这行代码创建了一个
-
打印
blue_cat
的内存地址:print(f'{id(blue_cat)}, blue_cat')
- 使用
id()
函数获取blue_cat
对象的内存地址,并打印出来
- 使用
-
给
blue_cat
添加name
属性:blue_cat.name = '蓝猫'
- 为
blue_cat
对象动态地添加了一个name
属性,并设置其值为'蓝猫'
- 为
-
调用
blue_cat
的eat
方法:blue_cat.eat()
- 当调用
eat
方法时,Python 会自动将blue_cat
作为self
参数传递给eat
方法 - 因此,
eat
方法中的self
就是blue_cat
对象,可以访问到blue_cat
的name
属性
- 当调用
-
打印分隔符:
print('_*_' * 30)
- 这行代码用于在输出中添加一个分隔符,以区分不同的对象。
-
创建第二个
Cat
对象black_cat
:black_cat = Cat() black_cat.name = '黑猫' print(f"{id(black_cat)}, black_cat")
- 同样地,创建了一个新的
Cat
实例black_cat
,并为其添加name
属性,设置为'黑猫'
。 - 打印
black_cat
的内存地址。
- 同样地,创建了一个新的
-
调用
black_cat
的eat
方法:black_cat.eat()
- 调用
black_cat
的eat
方法,此时self
是black_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
通过以上方式,可以灵活地对对象的属性进行各种操作,并根据需要实现特定的行为
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)