Установить атрибут класса после наследования - PullRequest
0 голосов
/ 04 октября 2018

Можно ли сделать что-то подобное:

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" 

Я хотел бы создать класс, от которого другие классы могут наследовать и получить свое имя на основе своего имени класса.Возможно ли это в Python 3?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вам это не нужно, оно уже есть:

>>> 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
0 голосов
/ 04 октября 2018

Да, классы также являются объектами, поэтому вы можете устанавливать атрибуты, как и в обычных объектах.

Однако, это Child.name, а не Child().name.Child() создает экземпляр и присваивает ему name вместо класса.

...