继承后设置 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().name
。 Child()
创建一个实例,并将 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
是否可以这样做:
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().name
。 Child()
创建一个实例,并将 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