笔记-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-动态添加属性的更多相关文章

  1. python动态添加属性和方法

    ---恢复内容开始--- python动态添加属性: class Person(object): def __init__(self,newName,newAge): self.name = newN ...

  2. python 动态添加属性及方法及“__slots__的作用”

    1.动态添加属性 class Person(object): def __init__(self, newName, newAge): self.name = newName self.age = n ...

  3. python动态添加属性

    class A: def __init__(self, info ={}): self.info = info def __getattr__(self, item): return self.inf ...

  4. day_5.26python动态添加属性和方法

    python动态添加属性和方法 既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx '''2018-5-26 13:40:09pyth ...

  5. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...

  6. Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...

  7. Python基础之动态添加属性,方法,动态类,静态类

    ## 动态添加属性class Person: def __init__(self,name): self.name = name# 1.通过对象.属性名称来操作p = Person('KTModel' ...

  8. 20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。

    概念: 并行:同时运行 并发:看似同时运行  json后任然中文的问题 import json d = {"名字":"初恋这件小事"} new_d1 = jso ...

  9. Runtime(动态添加属性)

    下面通过一个实例展示一下Runtime(动态添加属性)的用法 下面对运行时添加属性用到的策略参数进行补充: 这样看来,前面的NSString* name用的策略是retain nonatomic就知道 ...

随机推荐

  1. May 23rd 2017 Week 21st Tuesday

    Winners are not those who never fail but those who never quit. 成功者不是从不失败,而是从不放弃. Nothing is impossib ...

  2. GraphQL 到底怎么用?看看这个例子就知道了

    转载自: https://www.infoq.cn/article/i5JMm54_aWrRZcem1VgH

  3. Android(java)学习笔记6:实现Runnable接口创建线程 和 使用Callable和Future创建线程

    1. 前面说的线程的实现是新写一个子类继承Thread: 是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 2. 这里说的方案2是指 ...

  4. LA 2038 最少点覆盖

    题目链接:https://vjudge.net/problem/UVALive-2038 题意:我看了原题,lrj的书上题意写错了,应该是最少点覆盖,当然可以用最大匹配去做,由于是树形的: 可以树形D ...

  5. bpexpdate – 更改映像目录库中备份的截止日期以及介质目录库中介质的截止日期nbu

    1.根据bpdbjobs查找backupidbpdbjobs -jobid xxx -all_columns|grep backupid 2.查看数据保留时间[root@backup]# bpimag ...

  6. HDU 1298 T9【字典树增加||查询】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1298 T9 Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  7. Window下搭建foundation apps环境

    Window下搭建foundation apps环境 框架:AngularJS.Foundation, 构建工具:Gulp, 开发环境:node.js. 操作系统:windows (一)环境准备 1 ...

  8. mysql五种日期函数

    create table timess( id int primary key auto_increment, YEARs ——” DATEs DATE ——” TIMEs TIME ::——::” ...

  9. Git免密码提交

    下面说一下https克隆的方式免密码提交 在我们下载链接前面加上账号:密码@即可 方式一: 使用https的方式克隆代码 git clone '地址' 查看项目中的配置文件 vim .git/conf ...

  10. 代替eval执行字符串表达式

    function eval2(str) { var Fn = Function; return new Fn('return ' + str)(); }