Что бы вы ни делали, НЕ повторяю, НЕ используйте венгерскую нотацию!Это вызывает сильную головную боль и гниение.
Итак, что вы можете сделать?Python и C / C ++ довольно разные.В C ++ вы обычно обрабатываете полиморфные вызовы, например, так:
void doWithFooThing(FooThing *foo) {
foo->bar();
}
Динамический полиморфизм в C ++ зависит от наследования: указатель, передаваемый в doWithFooThing, может указывать только на экземпляры FooThing или один из его подклассов.В Python это не так:
def do_with_fooish(fooish):
fooish.bar()
Здесь можно использовать любую достаточно глупую вещь (то есть все, что имеет атрибут вызываемого бара), независимо от того, как она передается любой другой глупой вещи посредством наследования.
Дело в том, что в C ++ вы знаете, какой (базовый) тип имеет каждый объект, тогда как в Python это не так, и вам все равно.То, чего вы пытаетесь достичь в Python, - это код, который можно использовать повторно во всех возможных ситуациях, не прибегая к принудительному правилу наследования классов.Ваше наименование должно также отражать это.Вы не пишете:
def some_action(a_list):
...
, но:
def some_action(seq):
...
, где seq может быть не только списком, но и любой итерируемой последовательностью, будь то список, кортеж, dict, set, iterator,что угодно.
В общем, вы делаете акцент на предназначении вашего кода, а не на его структуре типов.Вместо того, чтобы писать:
dict_of_strings_to_dates = {}
вы пишете:
users_birthdays = {}
Это также помогает сохранять короткие функции, даже в большей степени, чем в C / C ++.Тогда вы легко сможете увидеть, что происходит.
Другое дело: вы не должны думать о переменных Python как о указателях на память.Они на самом деле являются диктионными записями:
assert foo.bar == getattr(foo, 'bar') == foo.__dict__['bar']
Не всегда точно так что, я согласен, но подробности можно посмотреть на docs.python.org .
И, кстати, в Python вы не объявляете вещи, как вы делаете в C / C ++.Вы просто определяете вещи.