Python有spwd模块与shadow密码文件进行交互。
您必须是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:type'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:比较超出了最大递归深度”。
有什么想法吗?或者我应该用其他方式来实现我的目标? THX。
答案 0 :(得分: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__
每个成员只调用一次。
答案 1 :(得分:2)
查看此主题:
How is the __getattribute__ method used?
您想要使用的是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)