Можно ли программно переименовать класс?

У меня класс Vehicle. Хочу переименовать в Rover. Я знаю, что мы можем создать другую ссылочную переменную, но я больше не хочу, чтобы имя класса было таким же.

Играл с __name__, но безуспешно.

class Vehicle:
    pass
st = "Rover"
Vehicle.__name__=st
obj1=Rover()

Ожидал: Класс Vehicle переименован в Rover без обработки файлов и внутри программы.

Было бы здесь наследование лучше? Изменение основного имени вашего класса приведет к поломке большого количества зависимого кода, не так ли?

ycx 30.12.2018 05:18

Зачем тебе это делать?

user2357112 supports Monica 30.12.2018 05:21

Да, определенно, но это похоже на то, что после того, как определенная часть моего кода будет выполнена, если я переименую этот класс и связанные подклассы для использования в каком-то другом файле, я могу сэкономить много работы.

Rex5 30.12.2018 05:22

В какой ситуации вы оказались, когда это сэкономило бы работу? Если вы объясните контекст, мы, вероятно, сможем предложить лучший вариант. Это похоже на XY проблема.

user2357112 supports Monica 30.12.2018 05:25

То, что вы пытаетесь сделать, очень далеко от передовой практики. Если вы хотите случайно выбрать имя класса, измените свой код.

Klaus D. 30.12.2018 05:31

Назначение класса __name__ абсолютно не приведет к тому, что существующая глобальная переменная Vehicle, которая относится к классу, изменит имя это ...

jasonharper 30.12.2018 05:38

[docs.python.org/3/tutorial/classes.html]This provides semantic for importing and renaming Я прочитал это, и поэтому я подумал, что переименование может быть выполнено, и не нашел никакой ссылки, которая могла бы помочь мне в этом, поэтому задал этот вопрос при подготовке простого класса транспортного средства с стоимостью, типом, суммой премий и т. д. В качестве атрибутов . Мысль о том, чтобы изменить имя на Rover и использовать атрибуты как есть.

Rex5 30.12.2018 05:43

Rex5: Мне кажется, что "Rover" должен быть строкой ценность экземпляра класса Vehicleатрибут: например. vehicle1.model. Люди часто путают эти два ...

martineau 30.12.2018 10:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
1 267
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В комментариях у вас есть (очень немного искаженная) цитата из https://docs.python.org/3/tutorial/classes.html:

This provides semantic for importing and renaming

Вот настоящая цитата с немного большим контекстом:

As in Smalltalk, classes themselves are objects. This provides semantics for importing and renaming.

Это говорит о том, что у нас может быть библиотека Python с классом в библиотеке:

# lib_k.py
class Klass:
    ... definitions ...

Затем в каком-нибудь другом модуле Python мы можем написать:

from lib_k import Klass as LibKClass

что в основном полезно, если мы также собираемся сделать:

from lib_l import Klass as LibLClass

а затем напишите такой код:

def f(args):
    obj_k = LibKClass(...)
    obj_l = LibLClass(...)

Я лично предпочитаю писать:

import lib_k
import lib_l

def f(args):
    obj_k = lib_k.Klass(...)
    obj_l = lib_l.Klass(...)

но разрешены оба способа, и какой из них использовать - дело вкуса, а не правильности.

import присвоение классу другого локального имени, как это, не изменяет фактический объект класса. то есть print(LibKClass.__name__) -> Klass и print(LibLClass.__name__) -> Klass. Кроме того, имена модулей (и, следовательно, соответствующие им имена файлов) должны быть в нижнем регистре (согласно PEP 8), поэтому я бы посоветовал избегать их использования здесь, в примере кода (потому что это может дать новичкам неправильное представление).
martineau 30.12.2018 09:54

@martineau: хороший момент, я переименую их здесь в lib_k и lib_l. Я подумал упомянуть тот факт, что __name__ остались без изменений, но решил на этом остановиться.

torek 30.12.2018 09:56

torek: Так лучше ... и не нужно упоминать, что не менял __name__ - я сделал это за вас здесь, в комментариях. ;¬)

martineau 30.12.2018 09:59

Другие вопросы по теме