Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python引用类似于函数的属性_Python_List_Properties_Reference_Setter - Fatal编程技术网

python引用类似于函数的属性

python引用类似于函数的属性,python,list,properties,reference,setter,Python,List,Properties,Reference,Setter,如何通过pythonical设置多个属性而不单独引用它们?下面是我的解决方案 class Some_Class(object): def __init__(self): def init_property1(value): self.prop1 = value def init_property2(value): self.prop2 = value self.func_list = [init_property1, init_prop

如何通过pythonical设置多个属性而不单独引用它们?下面是我的解决方案

class Some_Class(object):

    def __init__(self):
        def init_property1(value): self.prop1 = value
        def init_property2(value): self.prop2 = value

        self.func_list = [init_property1, init_property2]

    @property
    def prop1(self):
        return 'hey im the first property'

    @prop1.setter
    def prop1(self, value):
        print value

    @property
    def prop2(self):
        return 'hey im the second property'

    @prop2.setter
    def prop2(self, value):
        print value


class Some_Other_Class(object):

    def __init__(self):

        myvalues = ['1 was set by a nested func','2 was set by a nested func']
        some_class= Some_Class()

        # now I simply set the properties without dealing with them individually
        # this assumes I know how they are ordered (in the list)
        # if necessary, I could use a map

        for idx, func in enumerate(some_class.func_list):
            func(myvalues[idx])

        some_class.prop1 = 'actually i want to change the first property later on'

if __name__ == '__main__':
    test = Some_Other_Class()
当我有许多属性要用用户定义的值初始化时,这就成为必须要做的事情。否则,我的代码看起来就像一个单独设置每个属性的巨大列表(非常混乱)


请注意,下面很多人都有很好的答案,我认为我已经找到了一个很好的解决方案。这是一次重新编辑,主要是为了清楚地说明问题。但是,如果有人有更好的方法,请分享

如果您在object dict中查找属性,您将得到属性描述符(如果有),类也是如此;e、 g

a = SomeClass()
descriptor = a.__dict__.get('descriptor', type(a).__dict__.get('descriptor'))
假设
descriptor
是一个描述符,它将具有以下方法:

['deleter', 'fdel', 'fget', 'fset', 'getter', 'setter']

注意
fget
fset

只需使用@property decorator即可

>>> class A:
...    a=2
...    @property
...    def my_val(self,val=None):
...        if val == None:return self.a
...        self.a = val
...
>>> a=A()
>>> a.my_val
2
>>> a.my_val=7
>>> a.my_val
7
像这样的

如果您只想允许设置,那么不要给它一个默认值

>>> class A:
...    a=2
...    @property
...    def my_val(self,val):
...        self.a = val
...
>>> a=A()
>>> a.my_val
<Exception>
>>> a.my_val=7
>>> a.a
7
>>A类:
...    a=2
...    @财产
...    定义我的价值(自我,价值):
...        self.a=val
...
>>>a=a()
>>>我的
>>>a.my_val=7
>>>a.a
7.
或者,如果您只想允许检索,只需输入第二个参数

>>> class A:
...    a=2
...    @property
...    def my_val(self):
...        return self.a
...      
...
>>> a=A()
>>> a.my_val
2
>>> a.my_val=7
<Exception>
>>A类:
...    a=2
...    @财产
...    定义我的价值(自我):
...        回归自我
...      
...
>>>a=a()
>>>我的
2.
>>>a.my_val=7

I。。。最后,我想我知道你想做什么,你不需要按照你的方式去做。让我试试看

class someclass(object):

    def __init__(self):
        func_list = [self.setter1, self.setter2]
        value_list = [1, 2]
        #    These lines don't need to be this complicated.
        #    for ind in range(len(func_list)): 
        #        func_list[ind](value_list[ind])

        for idx, func in enumerate(func_list):
            func(value_list[idx])

        #  Or even better
        for idx, (func, val) in enumerate(zip(func_list, value_list)):
            func(val)

    def setter1(self, value): 
        self.a = value

    def setter2(self, value): 
        self.b = value

值得指出的是,idx变量和枚举调用在第二种形式中是多余的,但我不确定您在其他地方是否需要它。

在Python中,您无法确保类的变量具有只读访问权限。您只能阻止访问这些变量。
self.setter1
在做什么?如果您在类声明中,那么
self
将不会是您的类的实例。您能否更清楚地说明此代码的位置以及在此上下文中的
self
是什么。此外,您的代码中没有任何属性。您的问题仍然不是很清楚。“以后在代码中单独访问这些函数”是什么意思?在您的示例中,“稍后”在哪里?请举一个你想做什么的例子。-1感谢你的问题如此混乱,以至于你对每个答案都有抱怨。看一下:and(有用,即使你有一些代码)。在>=2.6-after
@property。。。定义my_val…
然后您可以执行
@my_val.setter。。。def my_val(self,val).
因此您不需要默认参数和第一个代码块中的第二个参数。添加得好。。。我想我以前用过这个。。。但是通常默认的arg对于我来说已经足够优雅了。问题不是如何实现基本检索的属性。举个例子:现在我想将“a”存储在一个列表g中,然后执行g[index_of_a]=5并让它更新属性。不幸的是,根据您的方法,属性的值存储在列表中,而不是属性setter方法。是的,我不能回答我自己的问题,因为我是一个新手。。。但我成功了。下面是我所做的:创建一个简单调用属性集方法的小函数:def setprop1(value):self.prop=value。现在,可以在列表中引用该函数(每个属性有一个函数)。如果你把它做成一个嵌套函数,在一个设置了所有属性的函数里面,你就再也不用看到它了!如果有人有一个更优雅的解决方案,让我知道!我明天会发布我的答案(当我有能力的时候)。我确信这是可行的,但老实说,这样的代码对我的大脑来说太难了。我恳求无知!你到底有什么困难?它有一个嵌套在另一个函数调用中的函数调用。那么,看看如何使用它来访问属性setter方法就好了。否则,这是不直观的-看我的答案below@ecr我在描述符上添加了一个方法列表,以防你们查不到。@ecr我仍然不知道你们想做什么。上面介绍了如何获取属性描述符。列表不是一段可执行的代码。close-但我正在尝试使用属性。看我的答案谢谢你对枚举的洞察力-你的部分答案将在我的答案中!