Python 对象属性和类属性

本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。

目录

对象属性与类属性

类属性

对象属性

属性优先级

动态对象属性只针对当前对象

动态添加属性和方法

动态添加属性

动态添加方法

引入方法参数处理库

添加方法

限制动态添加属性

总结


对象属性与类属性

类属性

创建Person类,设置一个name属性;

这时不进行实例化就可以直接通过类名获取属性,

这就是类属性。

示例如下:

python 复制代码
class Person(object):
    # 这里的属性为类属性 通过类名来调用
    name = 'Person'

print(Person.name)

# 执行结果
# Person

对象属性

在类实例化为对象时,赋值或添加的属性为对象属性(不会改变原有类属性值)。

示例如下:

python 复制代码
class Person(object):
    # 这里的属性为类属性 通过类名来调用
    name = 'Person'

    def __init__(self, name):
        # 对象属性赋值
        self.name = name

print(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
# 类属性没有发生改变
print(Person.name)

执行结果:

bash 复制代码
Person

small cat

Person

通过执行结果可以看出,实例化后赋值的name属性与类属性name并不相同,

最终也并没有通过赋值改变原有类属性的值。

属性优先级

对象属性优先级高于类属性。

场景:当Person对象未设置name属性时调用原有类属性值;

如果设置了对象属性,则调用对象属性值。

示例如下:

python 复制代码
class Person(object):
    # 这里的属性为类属性 通过类名来调用
    name = 'Person'

    def __init__(self, name):
        # 对象属性赋值
        # self.name = name
        pass

print(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)
p1.name = '张三'
print(p1.name)

执行结果:

bash 复制代码
Person

Person

张三

删除对象中的name属性,在调用会用到同名的类属性。

示例如下:

python 复制代码
class Person(object):
    # 这里的属性为类属性 通过类名来调用
    name = 'Person'

    def __init__(self, name):
        # 对象属性赋值
        self.name = name

print(Person.name)
p1 = Person('small cat')
# 打印对象属性
print(p1.name)

del p1.name
print(p1.name)

执行结果:

bash 复制代码
Person

small cat

Person

动态对象属性只针对当前对象

动态给对象添加对象属性,只针对当前对象生效,对于类创建的其他对象没有作用。

示例如下:

python 复制代码
class Person(object):
    # 这里的属性为类属性 通过类名来调用
    name = 'Person'

    def __init__(self, name):
        # 对象属性赋值
        self.name = name

print(Person.name)
p1 = Person('small cat')
p1.age = 18
print(p1.age)

p2 = Person('zhang san')
print(p2.age)

执行结果:

bash 复制代码
Traceback (most recent call last):

  File "E:\lianxipy\python基础\对象属性和类属性\Person.py", line 15, in <module>

    print(p2.age)

AttributeError: 'Person' object has no attribute 'age'

Person

183

注意:以后千万别说对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,在使用又能使用类属性了。

动态添加属性和方法

实例化对象后可进行动态添加属性和方法。

动态添加属性

创建一个空类,动态添加属性。

示例如下:

python 复制代码
class Person(object):
    pass


p1 = Person()
p1.name = '张三'
print(p1.name)

执行结果:

bash 复制代码
张三

动态添加属性,体现了动态语言的特点(灵活)

动态添加方法

引入方法参数处理库
python 复制代码
from types import MethodType
添加方法

在动态添加方法时,需要对方法的参数进行处理,否则会抛出self异常。

示例如下:

python 复制代码
class Person(object):
    pass


p1 = Person()
p1.name = '张三'
print(p1.name)

def say(self):
    print('我的名字叫:%s' % self.name)

p1.speak = MethodType(say, p1)
p1.speak()

执行结果:

bash 复制代码
张三

我的名字叫:张三

限制动态添加属性

比如只允许给对象添加name,age,height,weight属性

解决:定义类的时候,定义一个特殊属性(slots),可以限制动态添加的属性。

__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。

示例如下:

python 复制代码
class Person(object):

    __slots__ = ('name', 'age', 'height', 'weight')


p1 = Person()
p1.name = '张三'
print(p1.name)
p1.age = 18
print(p1.age)
p1.gender = '男'
print(p1.gender)

执行结果:

python 复制代码
张三

18

Traceback (most recent call last):

  File "E:\lianxipy\python基础\动态添加属性\Person.py", line 12, in <module>

    p1.gender = '男'

AttributeError: 'Person' object has no attribute 'gender'

当动态创建的gender属性不在__slots__中设置时,抛出异常。

总结

本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。

相关推荐
辞旧 lekkk1 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
2zcode2 小时前
运动模糊图像复原的MATLAB仿真与优化
开发语言·matlab
无风听海2 小时前
深入剖析 YARP 的 Transforms:构建灵活的反向代理转换管道
后端·中间件·asp.net
袁雅倩19972 小时前
当吸尘器、筋膜枪都用上Type-C,供电方案该怎么选?浅谈PD取电芯片ECP5702的应用
c语言·开发语言·支持向量机·动态规划·推荐算法·最小二乘法·图搜索算法
Gopher_HBo2 小时前
负载均衡
后端
自由生长20242 小时前
RAG已死?什么标题党啊!
后端
2301_809204703 小时前
JavaScript中严格模式use-strict对引擎解析的辅助.txt
jvm·数据库·python
zjy277773 小时前
mysql如何选择合适的索引类型_mysql索引设计实战
jvm·数据库·python
Aaswk3 小时前
Java Lambda 表达式与流处理
java·开发语言·python
万邦科技Lafite3 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台