Класс Python с целочисленной эмуляцией

Если бы Вы имеете длинный variablenames и закончили бы с:

UserHandler.GetUser.First.User.FirstName="Stefan"
UserHandler.GetUser.First.User.LastName="Karlsson"
UserHandler.GetUser.First.User.Age="39"
UserHandler.GetUser.First.User.Sex="Male"
UserHandler.GetUser.First.User.Occupation="Programmer"
UserHandler.GetUser.First.User.UserID="0"
....and so on

тогда я использовал бы СО сделать его более читаемым:

With UserHandler.GetUser.First.User
    .FirstName="Stefan"
    .LastName="Karlsson"
    .Age="39"
    .Sex="Male"
    .Occupation="Programmer"
    .UserID="0"
end with

В более позднем примере существует даже выигрыш в производительности по первому примеру, потому что в первом примере я выбираю пользователя каждый раз, когда я получаю доступ к свойству пользователя, и в СО СЛУЧАЕМ я только выбираю пользователя одно время.

я могу получить увеличение производительности, не используя с, как это:

dim myuser as user =UserHandler.GetUser.First.User
myuser.FirstName="Stefan"
myuser.LastName="Karlsson"
myuser.Age="39"
myuser.Sex="Male"
myuser.Occupation="Programmer"
myuser.UserID="0"

, Но я пошел бы для оператора WITH вместо этого, это выглядит более чистым.

И я просто взял это в качестве примера, так не жалуйтесь по классу со многими ключевыми словами, другой пример мог быть похожим: С RefundDialog. RefundDatagridView. SelectedRows (0)

5
задан Günther Jena 2 July 2016 в 12:28
поделиться

3 ответа

You need to override __new__, not __init__:

class Foo(int):
    def __new__(cls, some_argument=None, value=0):
        i = int.__new__(cls, value)
        i._some_argument = some_argument
        return i

    def print_some_argument(self):
        print self._some_argument

Now your class work as expected:

>>> f = Foo(some_argument="I am a customized int", value=10)
>>> f
10
>>> f + 8
18
>>> f * 0.25
2.5
>>> f.print_some_argument()
I am a customized int

More information about overriding new can be found in Unifying types and classes in Python 2.2.

5
ответ дан 18 December 2019 в 13:16
поделиться

В Python 2.4+ работает наследование от int:

class MyInt(int):pass
f=MyInt(3)
assert f + 5 == 8
7
ответ дан 18 December 2019 в 13:16
поделиться

Попробуйте использовать последнюю версию python. Ваш код работает в версии 2.6.1.

2
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: