笔记-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就知道 ...
随机推荐
- WPF产生不重复的随机数
WPF产生不重复的随机数 在给定的区间范围(比如[50,99]),产生给定数量的随机数(不如10个),要求产生的随机数不重复首先给定变量min=50;max=99+1;//习惯与程序规定的编码不同所致 ...
- windows下makefile命令详解
转自https://blog.csdn.net/xiexievv/article/details/45775005 1. 如果已经有vc6的dsp工程,可直接导出nmake脚本文件(.mak) “Pr ...
- 围绕react衍生出来的思考
优势一.声明式开发 首先react是声明式的开发方式,这个与之对应的是命令式开发方式,之前在用jquery写代码的时候,都是直接来操作dom,直接操作dom的这种编程方式,我们把他叫做命令式的编程,也 ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- 【翻译】苹果官网的命名规范之 Code Naming Basics-General Principles
苹果官方原文链接:General Principles 代码命名基本原则:通用规范 代码含义清晰 尽可能将代码写的简洁并且明白是最好的,不过代码清晰度不应该因为过度的简洁而受到影响.例如: 代码 ...
- qbxt Day1 测试犯傻祭祀
今天是2018/7/15 然后又是我最不喜乱的测试,期末考试爆炸仍在眼前. T1 van♂游戏 题意 小喵喵喜欢玩RPG游戏.在这款游戏中,玩家有两个属性,攻击和防御,现在小喵喵的攻击和防御都是1,接 ...
- Vue nodejs商城-订单模块
一.订单列表渲染 新建OrderConfirm.vue订单确认页面,添加路由 src/router/index.js添加路由 import OrderConfirm from '@/views/Ord ...
- 菜鸟崛起 DB Chapter 5 MySQL 5.6数据库表的基本操作
5 数据库表的基本操作 在数据库中,数据表是数据库中最重要.最基本的操作对象,是数据存储的基本单位.数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的.每一行代表一条唯一的记录,每一列代 ...
- 第一次接触mysql
一:数据库的好处 1. 可以持久化保存数据在本地 2.结构化查询 二:数据库常见的概念 1.DB: 是datebase数据库的缩写,储存数据得到容器 2.DBMS:数据库管理系统,用于管理数据库,和创 ...
- Python基础—12-面向对象(02)
面向对象 面向对象三大特点 封装:既可对数据结构进行封装,又可对处理数据的方法进行封装 继承:强调的父子类的关系 多态:不同对象调用相同的方法,会有不同的响应 类的继承 相关概念 继承:父类的属性和方 ...