笔记-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. 利用Surfingkeys和tampermonkey效率操作网页

    tampermonkey可以实现网页载入后自动进行某些操作,适合有规律的操作,实现完全自动化. 而Surfingkeys可以实现用各种按键实现各种功能,功能全部用JavaScript写,自定义性更强.

  2. 实验:将系统进程映射移到 Python 字典中

    参考官方文档,测试下列代码,把oracle的进程映射到python的字典中: [oracle@ycr python]$ more pro_get.py import reimport subproce ...

  3. VSCode cpptools 插件在Centos 7下不能正确显示符号列表的解决办法

    vscode 的插件cpptools 0.9.3 需要glibc 2.18的版本,但是Centos 7 下没有这个版本的GLIBC,所以导致链接库丢失,后台服务不能正常运行.按以下步骤操作可修复此问题 ...

  4. iOS UI(布局)约束是什么?view1.attr1 = view2.attr2 * multiplier + constant

    /* Create constraints explicitly.  Constraints are of the form "view1.attr1 = view2.attr2 * mul ...

  5. cs229 斯坦福机器学习笔记(一)-- 入门与LR模型

    版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/Dinosoft/article/details/34960693 前言 说到机器学习,非常多人推荐的学习资 ...

  6. android:TableLayout表格布局详解

    http://blog.csdn.net/justoneroad/article/details/6835915 这篇博文包括的内容:1.TableLayout简介2.TableLayout行列数的确 ...

  7. Vue nodejs商城-地址模块

    一.地址列表渲染 ,则不可以点击. src/views/Cart.vue <a class="btn btn--red" v-bind:class="{'btn-- ...

  8. JDBC连接数据库时错误提示的解决方案汇总

    今天在连接JDBC时,出现了错误 最开始的URL是这样写的 Connection conn = DriverManager.getConnection("jdbc:mysql://local ...

  9. iOS自动打开闪光灯

    现在好多应有都具备扫码功能,为了减少用户操作,一般会在光线比较暗的时候,自动打开闪光灯: 1.导入头文件 #import <AVFoundation/AVFoundation.h> #im ...

  10. 记录JavaScript的util.js类库

    工作中用到的, 不断做为积累, 以后能用到. 也感谢前辈们.  定义Util对象 var MyUtil = new Object(); 从url中获取参数 //从url中获取参数 function G ...