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 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。

相关推荐
ZhengEnCi12 分钟前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
python·llm·agent
金銀銅鐵40 分钟前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
镜子AI1 小时前
镜子AI工程教程:用Python实现关键词布局检查器与语义改写查重(附完整代码)
人工智能·python·microsoft
Mk598782 小时前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
后端
付威20232 小时前
从 Loop 到 Runtime:rpi Agent Loop 与 Cordis 的边界、取舍与组合
后端
小oo呆2 小时前
【学习心得】Python协程
python
IT_陈寒2 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
信誓旦旦的程序猿3 小时前
【Python量化实战宝典 #22】涨跌停、连板情绪手册:情绪指标构建(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
gCode Teacher 格码致知3 小时前
Pandas教学-21:subplots的使用
python·pandas·1024程序员节
2601_967980113 小时前
Python开发的顶级开源项目全景图:2025-2026年生态概览
python·机器学习·开源项目·数据科学·生态概览