继承后设置 class 属性

Set class attribute after inheritance

是否可以这样做:

class ParentClassName(object):
    name = camel_case_to_underscore(cls.__name__)

class ChildClassName(Parent):
    pass

assert Parent().name == "parent_class_name" 
assert Child().name == "child_class_name" 
assert Child.name == "child_class_name" 
assert getattr(Child, 'name') == "child_class_name" 

我想创建一个 class,其他 class 可以从中继承并根据他们的 class 名称设置他们的名称。 python 3 可以吗?

是的,classes 也是对象,因此您可以设置属性,就像在常规对象中所做的那样。

但是,它是 Child.name,而不是 Child().nameChild() 创建一个实例,并将 name 分配给它,而不是 class.

你不需要它,它已经存在了:

>>> class Parent(): pass
... 
>>> class Child(): pass
... 
>>> Parent.__name__
'Parent'
>>> Child.__name__
'Child'
>>> 

但是,如果您出于某种原因而没有费心解释而真的坚持自己动手,则可以使用自定义元类:

def camel_case_to_underscore(name):
    # your code here

class NamedType(type):
    def __new__(meta, name, bases, attribs):
        attribs["name"] = camel_case_to_underscore(name)
        return type.__new__(meta, name, bases, attribs)

class Parent(metaclass=NamedType):
    pass

class Child(Parent):
    pass