Функция ссылки в __init__ - PullRequest
       6

Функция ссылки в __init__

0 голосов
/ 19 сентября 2019

Я занимаюсь кодированием на python и столкнулся с небольшой проблемой: я определил несколько версий функций и хочу назначить одну из них в функции __init__ при создании своего объекта.Мне нужно, чтобы эти функции имели аргумент self.

Я нашел способ сделать это, но не могу сказать, правильно ли я использую язык.

В my_class.py

class my_class(object):
    fun_1 = lambda self,val: self.attr + val
    fun_2 = lambda self,val: self.attr - val


    def __init__(self, attr, fun_version):
        self.attr = attr

        my_class.fun = my_class.__dict__['fun_' + str(fun_version)]

В test.py

import my_class

my_instance_1 = my_class.my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))

my_instance_2 = my_class.my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))

Результат соответствует ожидаемому:

3
1

Есть ли более элегантный способ сделать это?Мне неловко определять метод класса в функции __init__.

1 Ответ

1 голос
/ 19 сентября 2019

Простой способ получить то, что вы хотите (класс и тестовый код в одном файле для простоты):

class my_class(object):
    fun_1 = lambda self,val: self.attr + val
    fun_2 = lambda self,val: self.attr - val


    def __init__(self, attr, fun_version):
        self.attr = attr

        self.fun = getattr(self, 'fun_' + str(fun_version))




my_instance_1 = my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))

my_instance_2 = my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))

#Proof that instances are independent:
print(my_instance_1.fun(1))

Отпечатки:

3
1
3

Если варианты fun не нужны атрибуты экземпляра (являются статическими методами), это можно записать следующим образом (это также можно записать с помощью lambda, как-то похоже на первый вариант, но это будет выглядеть ужасно):

class my_class(object):
    @staticmethod
    def fun_1(val):
        return 1 + val

    @staticmethod
    def fun_2(val):
        return 2 + val


    def __init__(self, attr, fun_version):
        self.attr = attr

        self.fun = getattr(my_class, 'fun_' + str(fun_version))
        # or (as above):
        # self.fun = getattr(self, 'fun_' + str(fun_version))



my_instance_1 = my_class(attr = 2, fun_version = 1)
print(my_instance_1.fun(1))

my_instance_2 = my_class(attr = 2, fun_version = 2)
print(my_instance_2.fun(1))

print(my_instance_1.fun(1))

Печать

2
3
2
...