笔记-python-动态添加属性
笔记-python-动态添加属性
1. 添加对象/类属性
添加对象属性
class Person(object):
def __init__(self, newName, newAge):
self.name = newName
self.age = newAge
zhangsan = Person("张三", 18)
zhangsan.addr = "北京" # 类对象zhangsan动态添加对象属性addr
print(zhangsan.name) # 张三
print(zhangsan.age) # 18
print(zhangsan.addr) # 北京
lisi = Person("李四", 28)
print(lisi.name) # 李四
print(lisi.age) # 28
print(lisi.addr) # 'Person' object has no attribute 'addr'
添加类属性:
class Person(object):
def __init__(self, newName, newAge):
self.name = newName
self.age = newAge
Person.addr = "北京" # 类Person动态添加类属性addr
zhangsan = Person("张三", 18)
print(zhangsan.name) # 张三
print(zhangsan.age) # 18
print(zhangsan.addr) # 北京
lisi = Person("李四", 28)
print(lisi.name) # 李四
print(lisi.age) # 28
print(lisi.addr) # 北京
2. 动态添加方法
类中有三种方法,实例,静态,类,其中静态和类方法没有什么太需要注意的。
def exp(s,*args):
print('function exp.')
A = type('A',(),{'exp':exp})
a = A()
class B():
def help1():
pass
b = B()
@staticmethod
def exp2():
print('function exp2.')
B.exp2 = exp2
@classmethod
def exp3(cls):
print('function exp3.')
B.exp3 = exp3
结果输出:
>>> b
<__main__.B object at 0x0000003949041E80>
>>> b.exp2
<function exp2 at 0x0000003948702E18>
>>> b.exp3
<bound method exp3 of <class '__main__.B'>>
>>> a.exp
<bound method exp of <__main__.A object at 0x0000003949041400>>
>>> A.exp
<function exp at 0x00000039492B02F0>
>>> B.exp2
<function exp2 at 0x0000003948702E18>
>>> B.exp3
<bound method exp3 of <class '__main__.B'>>
>>>
重点是添加实例方法
class B():
def help1():
pass
b = B()
@staticmethod
def exp2():
print('function exp2.')
B.exp2 = exp2
@classmethod
def exp3(cls):
print('function exp3.')
B.exp3 = exp3
def exp4():
print('function exp4')
import types
B.exp = types.MethodType(exp,b)
B.exp4 = exp4
结果输出:
>>> b.exp
<bound method exp of <__main__.B object at 0x0000009F6FAF1EF0>>
>>> b.exp4
<bound method exp4 of <__main__.B object at 0x0000009F6FAF1EF0>>
>>> b.exp3
<bound method exp3 of <class '__main__.B'>>
>>> b.exp2
<function exp2 at 0x0000009F6D6A2E18>
>>> b.help1
<bound method B.help1 of <__main__.B object at 0x0000009F6FAF1EF0>>
实例方法,实例方法,类方法,静态方法,实例方法,注意其中的区别。
3. __slots__
上面是如何添加属性,python也提供了一个特殊变量来限制实例可添加的属性名。
注意,是限制实例的属性名。
class C():
__slots__ = ('name', 'age')
pass
结果输出:
>>> c.ty = 45
Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
c.ty = 45
AttributeError: 'C' object has no attribute 'ty'
4. 总结
python的一切都是类,除了参数传递需要注意外,其实各种方法对外部的接口都是差不多的。
笔记-python-动态添加属性的更多相关文章
- python动态添加属性和方法
---恢复内容开始--- python动态添加属性: class Person(object): def __init__(self,newName,newAge): self.name = newN ...
- python 动态添加属性及方法及“__slots__的作用”
1.动态添加属性 class Person(object): def __init__(self, newName, newAge): self.name = newName self.age = n ...
- python动态添加属性
class A: def __init__(self, info ={}): self.info = info def __getattr__(self, item): return self.inf ...
- day_5.26python动态添加属性和方法
python动态添加属性和方法 既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx '''2018-5-26 13:40:09pyth ...
- 我的Python学习笔记(四):动态添加属性和方法
一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...
- Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法
1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...
- Python基础之动态添加属性,方法,动态类,静态类
## 动态添加属性class Person: def __init__(self,name): self.name = name# 1.通过对象.属性名称来操作p = Person('KTModel' ...
- 20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。
概念: 并行:同时运行 并发:看似同时运行 json后任然中文的问题 import json d = {"名字":"初恋这件小事"} new_d1 = jso ...
- Runtime(动态添加属性)
下面通过一个实例展示一下Runtime(动态添加属性)的用法 下面对运行时添加属性用到的策略参数进行补充: 这样看来,前面的NSString* name用的策略是retain nonatomic就知道 ...
随机推荐
- ZT C++关键字new学习
http://blog.csdn.net/waken_ma/article/details/4007914 C++关键字new学习 很多新手对C++关键字new可能不是很了解吧,今天我一起来学习一下. ...
- Windows 系统 Unicode 文件名操作(新建、重命名、枚举、复制)全攻略
常见的那些文件操作函数都不支持,于是为了达到目的,需要各种方法配合,应该是不如其他语言方便.我只是想看看Perl到底是否适合做这件事,于是折腾了一回. 文件的建立: 模块:Win32 Code: [全 ...
- 【[SCOI2009]粉刷匠】
这好像是个暴力? 但是跑的挺快的 我们设\(dp[i][j][k]\)表示在第\(i\)行我们最远染到的位置是\(j\),这一行上一共染了\(k\)次最多能染对多少个格子 理性分析一下啊,每一行最多也 ...
- Netbackup用于技术支持的问题报告(报障模版)
在与支持部门联系以报告问题之前,请填写以下信息. 日期: _________________________记录以下产品.平台和设备信息:■ 产品及其版本级别.■ 服务器硬件类型和操作系统级别.■ 客 ...
- Photoshop 画布的渐变填充
之前丢掉的要开始慢慢的捡起来,因为学如逆水行舟,不进则退.古人诚不欺我等. 1.新建图层,或者就在当前图层进行操作,选择图层 2.工具箱---1渐变工具---2径向渐变---模式--正常.不透明100 ...
- 【JeeSite】角色分配
主要是(roleAssign.jsp , selectUserToRole.jsp )2个jsp页面的JS方法调用比较复杂,主页面要获取弹窗页面的数据 var pre_ids = h.find(&qu ...
- Android学习笔记_38_图片的拖动、缩放功能和多点触摸
一.基础知识: 引用 理论上 Android可以处理 多达256 个手指的触摸,大概只有章鱼哥能享受这种技术带来的便利.就编程人员来说,编写多点触摸和单点触摸的方式几乎一模一样.其奥秘在于Motion ...
- o'Reill的SVG精髓(第二版)学习笔记——第二章
在网页中使用SVG 将SVG作为图像: SVG是一种图像格式,因此可以使用与其他图像类型相同的方式包含在HTML页面中,具体可以采用两种方法:将图像包含在HTML标记的<img>元素内(当 ...
- 全文搜索引擎 Elasticsearch 安装踩坑记录
一.安装 Elastic 需要 Java 8 环境.如果你的机器还没安装 Java 安装完 Java,就可以跟着官方文档安装 Elastic.直接下载压缩包比较简单. $ wget https://a ...
- SpringMVC知识点总结
1. SpringMVC概述 SpringMVC是一个WEB层框架,主要用来负责与页面的交互. SpringMVC是Spring家族的一大组件.Spring整合Spring ...