3

Python 有 spwd 模块来与影子密码文件进行交互。

您必须是 root 才能使用 spwd 模块。

>>> import spwd;

>>> a = spwd.getspnam('bin')

>>> type(a)
<class 'spwd.struct_spwd'>

>>> a.__gt__
<method-wrapper '__gt__' of spwd.struct_spwd object at 0x7fd017641b80>

现在我想为对象“a”(或类“struct_spwd”)添加一个新属性。我怎么做?

继承不起作用。

import spwd

class Abc(spwd.struct_spwd):
    pass

我得到“TypeError:类型'spwd.struct_spwd'不是可接受的基本类型”。

向对象添加动态属性不起作用。

import spwd

a = spwd.getspnam('bin')
a.new_attribute = lambda: print('hello world')

我得到“AttributeError:'spwd.struct_spwd'对象没有属性'new_attribute'”。

不过,使用委托可能会奏效。但我想保留它的原始属性。

import spwd

class Abc(object):
    def __init__(self, struct_spwd):
        self.struct_spwd = struct_spwd

    def __getattribute__(self, name):
        if name=='new_attribute':
            print('hello world')
        else:
            self.struct_spwd.__getattribute__(name)

a = spwd.getspnam('bin')
b = Abc(a)
b.new_attribute
b.__gt__

我得到了“RuntimeError:比较中超出了最大递归深度”。

任何想法?还是我应该使用其他方式来实现我的目标?谢谢。

4

2 回答 2

3
class Wrapper(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped

    def __getattr__(self, name):
        if name.startswith('sp_'):
            value = getattr(self.wrapped, name)
            setattr(self, name, value)
            return value

        raise AttributeError

该代码还缓存这些值,因此__getattr__每个成员只调用一次。

于 2013-08-15T03:41:57.360 回答
2

看看这个线程:

__getattribute__ 方法是如何使用的?

您要使用的是 getattr():

class Abc(object): def __init__(self, struct_spwd): self.struct_spwd = struct_spwd def __getattr__(self, name): if name=='new_attribute': print('hello world') else: return getattr(self.struct_spwd, name)

于 2013-08-15T04:10:58.850 回答