Python的动态生成成员方法
in python with 0 comment

Python的动态生成成员方法

in python with 0 comment

1. 先从简单的入手

最近在写一个比较复杂的有关新闻的区县分发系统。为了避免把马鞍山的新闻发布至鞍山,我希望能够尽量的精确。

所以,首先我希望获得新闻中所有省份的信息。之后根据省份发布到区县中(当然这个层级关系如果更复杂,分发的精度也会越高)。

但是,全国有很多省份,而且IO操作十分浪费时间,并且我也不想一次性把所有文件都读入内存。那应该怎么做呢?

# -*- coding: utf-8 -*
class BaseDynamic(object):
    def insert_attr(self, name, value):
        self.__dict__.setdefault(name, value)

    def update_attr(self, name, value):
        self.__dict__.update(name=value)

    def delete_attr(self, name):
        self.__dict__.pop(name)

    def has_attr(self, name):
        return True if name in self.__dict__.keys() else False

    def get_attr(self, name):
        return self.__dict__.get(name)

这里提供了我的解决方案,因为迫于不想一次性加载所有数据,所以采用了动态生成成员变量的方式。

Python的魔法方法__dict__提供了存储成员变量的地方,它是一个字典。因此这也让动态成员变量变成了可能。

2. 更深入一点?

如果要为一个实例增加方法,最简单的方式就是直接赋值了:

class Foo(object):
    pass


def hello():
    print('hello world')


def main():
    foo = Foo()
    foo.hello = hello
    foo.hello()

或者可以使用types中的MethodType来动态绑定一个方法:

import types


class Foo(object):
    def __init__(self):
        pass


def hello(self):
    print('hello world')



def main():
    foo = Foo()
    foo.hello = types.MethodType(hello, foo)
    foo.hello()

但是这些并不是最终的结果。

Responses