Как украсить класс?

Проблема 1: Вы можете создать маску и установить красный канал на False, чтобы сохранить значение 255, если вы хотите настроить таргетинг только на белые пиксели

mask_bg = (image == [255, 255, 255])
mask_bg[:, :, 0] = False  # set red channel mask to false (leave 255 value)

image[mask_bg] = 0  # set all white pixels to [255, 0, 0]

Если вы хотите найти все значения в диапазоне, который вы можете использовать cv2.inRange:

mask = cv2.inRange(image, (230, 230, 230), (255, 255,255))

Проблема 2: OpenCV использует BGR по умолчанию вместо RGB, вы можете конвертировать из BGR в RGB с помощью:

new_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow('BGR Image', new_image )
[ 118] Имейте в виду, что если вы откроете изображение с помощью OpenCV, это будет BGR, поэтому преобразуйте его, прежде чем манипулировать каналами.

118
задан martineau 8 January 2019 в 22:06
поделиться

3 ответа

Я был бы второй понятие, что можно хотеть рассмотреть подкласс вместо подхода, который Вы обрисовали в общих чертах. Однако не зная Ваш определенный сценарий, YMMV :-)

То, о чем Вы думаете, является метаклассом. __new__ функция в метаклассе передается полное предложенное определение класса, который это может затем переписать, прежде чем класс создается. Вы можете, в то время, sub конструктор для нового.

Пример:

def substitute_init(self, id, *args, **kwargs):
    pass

class FooMeta(type):

    def __new__(cls, name, bases, attrs):
        attrs['__init__'] = substitute_init
        return super(FooMeta, cls).__new__(cls, name, bases, attrs)

class Foo(object):

    __metaclass__ = FooMeta

    def __init__(self, value1):
        pass

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

73
ответ дан orokusaki 24 November 2019 в 01:55
поделиться

Кроме вопроса, являются ли декораторы класса правильным решением Вашей проблемы:

В Python 2.6 и выше, существуют декораторы класса с - синтаксис, таким образом, можно записать:

@addID
class Foo:
    pass

В более старых версиях можно сделать это иначе:

class Foo:
    pass

Foo = addID(Foo)

Обратите внимание однако, что это работает то же что касается функциональных декораторов, и что декоратор должен возвратить новое (или измененный оригинал) класс, который не является тем, что Вы делаете в примере. addID декоратор был бы похож на это:

def addID(original_class):
    orig_init = original_class.__init__
    # Make copy of original __init__, so we can call it without recursion

    def __init__(self, id, *args, **kws):
        self.__id = id
        self.getId = getId
        orig_init(self, *args, **kws) # Call the original __init__

    original_class.__init__ = __init__ # Set the class' __init__ to the new one
    return original_class

Вы могли затем использовать соответствующий синтаксис для своей версии Python, как описано выше.

Но я соглашаюсь с другими, что наследование лучше подходит, если Вы хотите переопределить __init__.

194
ответ дан Peter Mortensen 24 November 2019 в 01:55
поделиться

Это не хорошая практика и нет никакого механизма, чтобы сделать это из-за этого. Правильным способом выполнить, что Вы хотите, является наследование.

Смотрите в документацию класса.

Немного примера:

class Employee(object):

    def __init__(self, age, sex, siblings=0):
        self.age = age
        self.sex = sex    
        self.siblings = siblings

    def born_on(self):    
        today = datetime.date.today()

        return today - datetime.timedelta(days=self.age*365)


class Boss(Employee):    
    def __init__(self, age, sex, siblings=0, bonus=0):
        self.bonus = bonus
        Employee.__init__(self, age, sex, siblings)

Таким образом, у Босса есть все Employee имеет, с также его собственным __init__ метод и собственные участники.

12
ответ дан Esteban Küber 24 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

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