笔记-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. Linux --远程访问控制

    1.SSH服务端 修改配置文件 vi /etc/ssh/sshd_config 监听选项 port 22 //监听端口地址 ListenAddress 192.168.1.50 //监听地址为本机地址 ...

  2. June 02nd 2017 Week 22nd Friday

    A burden of one's choice is not felt. 爱挑的担子不嫌重. When doing things I love to do, I seldom feel tired ...

  3. March 6 2017 Week 10 Monday

    A well-spent day brings happy sleep. 丰盈白日,安眠晚间. Recently my sleep is not so good, for one thing I go ...

  4. oozie调用java实例------shell action

    Oozie提供了一个方便的方式来运行任何命令.这可能是Unix命令,Perl或Python脚本,甚至java程序都可以通过Unix shell调用.shell命令运行在任意的Hadoop集群节点上,并 ...

  5. (转)每天一个linux命令(1):ls命令

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...

  6. Android(java)学习笔记39:Android 修改字体

    首先如果android内部自带的字体不是我们需要的字体,那我们就需要字体文件导入到android开发工程中,下午我们详细讲述: 1.我们首先分析知道,我想要TextView控件中文字的字体是:华文楷体 ...

  7. 活到老学到老:iOS开发中的基础知识(一)

    本文参考 标哥的博客:宝库iOS开发笔试题 进行学习整理.与其说是看面试题,不如说是对自己知识的巩固.工欲善其事必先利其器,基础知识不牢固可能会导致编程中的一些注意不到的问题.总之一句话:活到老,学到 ...

  8. ISIS Scanner Errors codes

    This section lists errors sorted by number: Error # Defined Constant String Defined In PIXDFLT 0 PIX ...

  9. TDD: 测试静态方法

    对于静态方法,mock框架大多不支持测试.所以需要修改代码,以便调用的静态方法可测试. 1  一个静态方法类: public class MyHelper{ public static string ...

  10. react(三):容器组件和傻瓜组件

    让一个组件只专注于一件事,如果发现让一个组件做的事情太多,就可以把这个组件拆分成多个组件让每一个组件只专注于一件事 <深入浅出react和redux> ---程墨 一个react组件最基本 ...