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

相关推荐
Rverdoser4 分钟前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
dj24429457078 分钟前
JAVA中的Lamda表达式
java·开发语言
谢眠13 分钟前
深度学习day3-自动微分
python·深度学习·机器学习
z千鑫22 分钟前
【人工智能】深入理解PyTorch:从0开始完整教程!全文注解
人工智能·pytorch·python·gpt·深度学习·ai编程
流星白龙38 分钟前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生1 小时前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo1 小时前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse1 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴1 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
乌啼霜满天2491 小时前
JDBC编程---Java
java·开发语言·sql