python面向对象-动态实例属性

概述

python是 动态语言,可以 动态 添加、删除 对象的 实例属性,有时在获取某对象的属性时,应先判断是否存在该属性

准备

创建类

class Phone:

    pass

添加属性-方式一

iphone=Phone("iphoneX")

动态设置属性, 对象名.属性名 = 属性值

iphone16.cpu = 'A16'
iphone16.ram = 8
iphone16.screen = 6.1
iphone16.active = False

访问属性:

print("顾客问:这是什么cpu?")
# 访问属性,对象名.属性名
print("店员答:",iphone16.cpu)
print("顾客问:内存是多大?")
print("店员答:",iphone16.ram)
print("顾客问:是二手手机吗?")
print("店员答:",iphone16.active)

修改属性:

print("顾客说:你帮我激活手机")
# 修改属性,与设置属性相同
iphone16.active = True
print("店员答:",iphone16.active)

问题

如何证明cpu属性只是存在iphone实例中,不存在huawei实例中?

查看对象拥有的属性

通过内置属性 __dict__查看对象所有的属性,返回的是dict类型。

详见:http://www.malaoshi.top/show_1EF2CdO4Y648.html

print(iphone.__dict__)
print(huawei.__dict__)

结果

{'name': '华为P20'}
{'name': 'iphoneX', 'cpu': 'A11'}

从结果可知,通过动态添加的属性,只是在iphone实例才有,huawei实例是没有的

不推荐动态添加对象的属性

动态添加对象的属性,会导致同一个类创建的对象,属性不一致,如:属性 cpu 仅 iphone 这个实例才有,别的对象没有该 cpu 属性。

所以这种方式不推荐

添加属性-方式二

#函数
setattr(obj,name,value)

设置一个属性。如果属性存在,就修改属性值,如果属性不存在,会创建新属性,代码如下:

setattr(iphone,"screen_size",6)
print(iphone.screen_size)
print(iphone.__dict__)

访问对象的属性

#函数
getattr(obj, name[, default])
  1. 如果不设置默认值,在访问不存在的属性时,会报错
    AttributeError: 'Phone' object has no attribute 'rom'
    
  2. 如果设置默认值,在访问不存在的属性时,会返回默认值,但该实例并没有该属性

代码如下:

#访问存在的属性
print(getattr(iphone,"name"))
#访问不存在的属性,会报错
print(getattr(iphone,"rom"))
#设置默认值,访问不存在的属性时,会返回默认值,但不会添加该属性
print(getattr(iphone,"rom","64G"))
#查看iphoen的属性,没有rom属性
print(iphone.__dict__)

判断属性是否存在

#返回布尔值,存在返回True,不存在返回False
hasattr(obj,name)

代码如下:

#属性不存在时返回False
print(hasattr(iphone,"rom"))
#属性存在时返回True
print(hasattr(iphone,"name"))

删除属性

#无返回值
delattr(obj, name)

注意:

属性名必须是字符串

代码如下:

#删除实例iphone的name属性
delattr(iphone,'name')
print(iphone.__dict__)

感谢文章:
http://www.cnblogs.com/cenyu/p/5713686.html

https://www.cnblogs.com/zh1164/p/6031464.html


原文出处:/show_1EF2COpKYNhG.html