gpt4 book ai didi

python - 如何在保留其原始属性的同时向 struct_spwd 类型添加新属性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:16 26 4
gpt4 key购买 nike

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:type 'spwd.struct_spwd' is not an acceptable base type”。

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

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:比较时超过最大递归深度”。

有什么想法吗?还是我应该使用其他方式来实现我的目标?谢谢。

最佳答案

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__

关于python - 如何在保留其原始属性的同时向 struct_spwd 类型添加新属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18245888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com