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

相关推荐
Sirius.z2 小时前
第R6周:LSTM实现糖尿病探索与预测
python
名字还没想好☜2 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
LucianaiB2 小时前
毕业老学长给我留的最后一句话是:“AI 写的,别挂我名。” 我直接 神(Seed Evolving) 来!助我!
后端
IvanCodes2 小时前
RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成
人工智能·后端·agent
·薯条大王2 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
CodeSheep3 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
小满zs3 小时前
Go语言第八章(函数)
后端·go
Dxy12393102163 小时前
Python 如何使用 MySQL 的事务
python·mysql
stark张宇5 小时前
实战Go高级特性:Context超时控制、defer资源回收与Channel通信的关键避坑点
后端·go
一壶浊酒..5 小时前
Scrape Webpack练习
开发语言·javascript·webpack