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

相关推荐
Lee川3 小时前
从零解剖一个 AI Agent Tool是如何实现的
前端·人工智能·后端
Aurorar0rua3 小时前
CS50 x 2024 Notes C -14
c语言·开发语言·学习方法
小短腿的代码世界4 小时前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
MY_TEUCK4 小时前
【2026最新Python+AI学习基础】Python 入门笔记篇
笔记·python·学习
2401_833269304 小时前
Java网络编程入门
java·开发语言
金銀銅鐵4 小时前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
青瓦梦滋4 小时前
C++的IO流与STL的空间配置器
开发语言·c++
赢乐4 小时前
大模型学习笔记:检索增强生成(RAG)架构
人工智能·python·深度学习·机器学习·智能体·幻觉·检索增强生成(rag)
五月君_5 小时前
Bun v1.3.14 发布,Rust 版即将进 Claude Code 内测,下一版可能就告别 Zig
开发语言·后端·rust
明月_清风5 小时前
🍃 MongoDB 从入门到上手:一篇写给新手的科普指南
后端·mongodb