给Python的类和对象动态增加属性和方法 | Python 主题月

简介: 通常我们会将编程语言分为静态和动态。静态语言的变量是在内存中的有类型的且不可变化的,除非强制转换它的类型;动态语言的变量是指向内存中的标签或者名称,其类型在代码运行过程中会根据实际的值而定。Python就是典型的动态语言。

通常我们会将编程语言分为静态和动态。静态语言的变量是在内存中的有类型的且不可变化的,除非强制转换它的类型;动态语言的变量是指向内存中的标签或者名称,其类型在代码运行过程中会根据实际的值而定。Python就是典型的动态语言。


动态添加属性


当类或者对象的属性在需要增加的时候,对于不方便修改源码的情况下,我们可以选择动态的对其添加属性。


动态给对象添加属性


对象属性只在当前对象生效,在其他对象中是无法调用的。

定义一个类:


class Student(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
复制代码


执行:(给实例添加数学成绩属性并且初始化)


>>> from payhlib import Student 
>>> s=Student('phyger',18) 
>>> s.name
'phyger'
>>> s.age
18
>>> s.math_score=100
>>> s.math_score    
100
>>> ss=Student('xiaopang',28)
>>> ss.name
'xiaopang'
>>> ss.age 
28
>>> ss.math_score
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'math_score'
>>>
复制代码


动态给类添加属性


类属性在其所有的对象中都生效。


执行:(默认所有对象的音乐成绩为60,当然你也可以对其进行修改)


>>> from payhlib import Student
>>> Student.music_score=60
>>> s1=Student('phyger',19) 
>>> s1.name
'phyger'
>>> s1.age
19
>>> s1.music_score
60
>>> s2=Student('xiaopang',29)
>>> s2.music_score
60
>>>
复制代码


动态添加方法


当类或者对象的方法在需要增加的时候,对于不方便修改源码的情况下,我们可以选择动态的对其添加方法。


动态给对象添加方法


给对象添加的方法只绑定在当前对象上,不对其他对象生效,而且需要传入self参数。

执行:(通过types.MethodType方法给a对象绑定sayhi方法)


>>> from payhlib import Student
>>> a=Student('phyger',17) 
>>> def sayhi(self):
...     print('hi...')
... 
>>> a.sayhi()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'sayhi'
>>> import types  
>>> a.sayhi=types.MethodType(sayhi,a)
>>> a.sayhi()
hi...
>>> b=Student('xiaopang',27) 
>>> b.sayhi()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'sayhi'
>>>
复制代码


动态给类添加方法(类方法和静态方法)


给类添加的方法对它的所有对象都生效,添加类方法需要传入self参数,添加静态方法则不需要。


执行:(给类添加静态方法)


>>> from payhlib import Student                 
>>> stu = Student('phyger',16)
>>> @staticmethod
... def staticHi():
...     print('staticHi...')
... 
>>> Student.hi=staticHi  
>>> stu.hi
<function staticHi at 0x000001CB617F13A8>
>>> stu.hi()
staticHi...
>>>
复制代码


执行:(给类添加类方法)


因为类方法只能使用类变量,所以我们增加一个类变量home


class Student(object):
    home='china'
    def __init__(self,name,age):
        self.name=name
        self.age=age
>>> from payhlib import Student
>>> stu = Student('phyger',17)  
>>> @classmethod        
... def classHi(self):  
...     print(self.home)
... 
>>> Student.chi=classHi
>>> stu.chi()
china
>>>
复制代码


限制给类或对象添加的属性


假如我们只希望类或者对象有name,age,score三个属性,我们可以借助__slots__来做,而且无法添加其他属性。


修改类:


class Student(object):
    home='china'
    __slots__=('name','age','score')   #init中变量必须在__slots__中
    def __init__(self,name,age):
        self.name=name
        self.age=age
复制代码


执行:


>>> from payhlib import Student
>>> st = Student('phyger',16)
>>> st.name 
'phyger'
>>> st.age 
16
>>> st.score
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: score
>>> st.score =100
>>> st.score      
100
>>> st.phone='123'      #无法添加phone属性
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'phone'
>>>
复制代码


多总结几点:


  • 类属性是read-only的
  • 静态方法无法使用类变量
  • 类方法只能使用类变量,不能使用初始化变量
  • __slots__数据类型为元组
  • __slots__只对当前类生效,对其子类不生效
相关文章
|
11月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
652 1
|
12月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
411 2
|
11月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
1664 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
11月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
305 4
|
11月前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
322 0
|
12月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
630 0
|
SQL JSON C语言
Python中字符串的三种定义方法
Python中字符串的三种定义方法
936 2
|
Python
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
面向对象和面向过程,是两种编程思想. 编程思想是指对待同一个问题,解决问题的套路方式.面向过程: 注重的过程,实现的细节.亲力亲为.面向对象: 关注的是结果, 偷懒.类和对象,是面向对象中非常重要的两个概念object 是所有的类基类,即最初始的类class 类名(object): 类中的代码PEP8代码规范:类定义的前后,需要两个空行 创建的对象地址值都不一样如dog和dog1的地址就不一样,dog的地址为2378043254528dog1的地址为2378044849840 8.类内部操作属性 sel
645 1
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法

推荐镜像

更多