Setting a class attribute with a given name in python while defining the class

前端 未结 4 1417
南旧
南旧 2021-02-02 16:48

I am trying to do something like this:

property = \'name\'
value = Thing()
class A:
  setattr(A, property, value)
  other_thing = \'normal attribute\'

  def __i         


        
相关标签:
4条回答
  • 2021-02-02 17:23

    This may be because the class A is not fully initialized when you do your setattr(A, p, v) there.

    The first thing to try would be to just move the settattr down to after you close the class block and see if that works, e.g.

    class A(object):
        pass

    setattr(A, property, value)

    Otherwise, that thing Ignacio just said about metaclasses.

    0 讨论(0)
  • 2021-02-02 17:33

    You can do it even simpler:

    class A():
        vars()['key'] = 'value'
    

    In contrast to the previous answer, this solution plays well with external metaclasses (for ex., Django models).

    0 讨论(0)
  • 2021-02-02 17:36

    You'll need to use a metaclass for this:

    property = 'foo'
    value = 'bar'
    
    class MC(type):
      def __init__(cls, name, bases, dict):
        setattr(cls, property, value)
        super(MC, cls).__init__(name, bases, dict)
    
    class C(object):
      __metaclass__ = MC
    
    print C.foo
    
    0 讨论(0)
  • 2021-02-02 17:36

    So I know this is really old and probably beating a dead horse and this may not have been possible at the time but I cam across this trying to solve my own problem.

    I realized this can be accomplished without metaclassing.

    The setattr takes and object, accessor name, and value. Well the object is not the class name it's the specific instance of the class, which can be accomplished with self.

    class A(object):
        def __init__(self):
            self.a = 'i am a accessor'
            setattr(self, 'key', 'value')
    
    a = A()
    print a.a
    print a.key
    
    0 讨论(0)
提交回复
热议问题