Вызов частных методов для метода класса: Python -- python пол Связанный проблема

calling private methods for class method: python


0
vote

проблема

русский

Я пытаюсь реализовать несколько конструкторов в Python, а одно из предложений (через онлайн-поиск) должен был использовать ClassMethod. Однако, используя это, у меня проблемы с повторным использованием кода и модульности. Вот пример, где я могу создать объект на основе прилагаемого файла или через некоторые другие средства:

 <код> class Image:      def __init__(self, filename):          self.image = lib.load(filename)          self.init_others()      @classmethod     def from_data(cls, data, header):         cls.image = lib.from_data(data, header)         cls.init_others()         return cos      def init_others(self):         # initialise some other variables         self.something = numpy.matrix(4,4)   

Теперь кажется, что я не могу этого сделать. CLS.INIT_OTHERS () вызов не проходит, заявив, что я не предоставил объекту называть это. Я думаю, я могу инициализировать вещи в самой функции из_дата, но потом повторяю код в методе INIT и другие «конструкторы». Кто-нибудь знает, как я могу назвать эти другими методами инициализатора из этих функций @Classmethod? Или, возможно, кто-то знает лучший способ инициализации этих переменных.

Я пришел с фона C ++. Так что все еще пытаюсь найти свой путь вокруг Python Constres.

Английский оригинал

I am trying to implement multiple constructors in python and one of the suggestions (through online searching) was to use the classmethod. However, using this, I am having issues with code reuse and modularity. Here is an example where I can create an object based on a supplied file or through some other means:

class Image:      def __init__(self, filename):          self.image = lib.load(filename)          self.init_others()      @classmethod     def from_data(cls, data, header):         cls.image = lib.from_data(data, header)         cls.init_others()         return cos      def init_others(self):         # initialise some other variables         self.something = numpy.matrix(4,4) 

Now it seems that I cannot do that. The cls.init_others() call fails by saying that I have not provided the object to call it on. I guess I can initialise things in the from_data function itself but then I repeat the code in the init method and the other "constructors". Does anyone know how I can call these other initialiser methods from these @classmethod marked functions? Or perhaps someone knows a better way to initialise these variables.

I come from a C++ background. So still trying to find my way around the python constructs.

</div
  
     
     

Список ответов

2
 
vote
vote
Лучший ответ
 

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

 <код> class Image:      def __init__(self, image):         self.image = image         self.init_others()      @classmethod     def from_data(cls, data, header):         return cls(lib.from_data(data, header))      @classmethod     def from_filename(cls, filename):         return cls(lib.load(filename))      def init_others(self):         # initialise some other variables         self.something = numpy.matrix(4, 4)   

Это добавляет возможность создавать экземпляр, если у вас уже есть <код> image тоже.

 

Your class method should create and return a new instance of the class, not assign class attributes and return the class itself. As an alternative to the keyword arguments, you could do something like:

class Image:      def __init__(self, image):         self.image = image         self.init_others()      @classmethod     def from_data(cls, data, header):         return cls(lib.from_data(data, header))      @classmethod     def from_filename(cls, filename):         return cls(lib.load(filename))      def init_others(self):         # initialise some other variables         self.something = numpy.matrix(4, 4) 

This adds the ability to create an instance if you already have the image, too.

</div
 
 
2
 
vote

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

 <код> class Image(object):     def __init__(self, filename=None, data=None, header=None):          if filename is not None:              self.image = lib.load(filename)          elif data is not None and header is not None:              self.image = lib.from_data(data, header)          else:              raise ValueError("You must provide filename or both data and header")          self.init_others()      def init_others(self):         # initialise some other variables         self.something = numpy.matrix(4,4)   

Это более питонический способ обрабатывать этот сценарий.

 

I would recommend not trying to create multiple constructors, and use keyword arguments instead:

class Image(object):     def __init__(self, filename=None, data=None, header=None):          if filename is not None:              self.image = lib.load(filename)          elif data is not None and header is not None:              self.image = lib.from_data(data, header)          else:              raise ValueError("You must provide filename or both data and header")          self.init_others()      def init_others(self):         # initialise some other variables         self.something = numpy.matrix(4,4) 

This is a more Pythonic way to handle this scenario.

</div
 
 
1
 
vote

Вы всегда должны проходить в <код> self в качестве первого аргумента любого метода, который будет действовать на экземпляре класса. Python не будет автоматически определять экземпляр, который вы пытаетесь вызвать метод, если только вы этого не сделаете. Так что, если вы хотите использовать функцию класса, как

 <код> the_image = Image("file.txt") the_image.interpolate(foo,bar)   

Вам нужно определить метод в <код> :expires_in0 как

 <код> :expires_in1  
 

You should always pass in self as the first argument to any method that will act on a class instance. Python will not automatically determine the instance you're trying to call the method for unless you do that. So if you want to use a class function like

the_image = Image("file.txt") the_image.interpolate(foo,bar) 

You need to define the method within Image as

def interpolate(self,foo,bar):   # Your code 
</div
 
 
 
 

Связанный проблема

2  Добавьте номера в шестнадцатеричном базе без конвертации баз?  ( Add numbers in hexadecimal base without converting bases ) 
Мне нужно написать функцию, которая получает два числа в шестнадцатеричном базе, и вычисляет сумму обоих из них, мне не разрешено преобразовывать их в десятич...

1  Выполнить файл SQL, возвращать результаты как Pandas DataFrame  ( Execute sql file return results as pandas dataframe ) 
У меня есть сложный запрос SQL Server, который я хотел бы выполнить из Python и вернуть результаты в виде файла PandaFrame. Моя база данных читается только ...

2  Векторный способ применить 3-измерительную маску к RGB в Pytorch  ( Vectorized way to apply a 3 dimension mask to rgb in pytorch ) 
У меня есть тензор HXWX3, представляющий изображение RGB, и тензора RGBX3 (Boolean) Tensor в качестве ввода. Предполагается, что для каждого (i, j) в маске те...

0  Использование Selenium Python при взаимодействии с веб-сайтом вручную  ( Using selenium python while interacting with a website manually ) 
Обновление: Я создал пользовательский профиль с совместимым способом IE в качестве по умолчанию и получить ту же сообщение об ошибке, поэтому кажется что-то о...

0  Почему этот сценарий Python работает на Ubuntu, но не распачин?  ( Why does this python script work on ubuntu but not raspbian ) 
Друг, и я создал следующий скрипт, использующий BeautifulSoup, чтобы получить HTML страницы работы, а затем добавить работу на массив, затем файл, затем отпра...

5  Сайт к изображению  ( Website to image ) 
Я запускаю Python 3.1, и вы бы назвали меня продвинутым начинающим :) Мой вопрос простой: я пытаюсь сделать простую программу, которая просит пользователям ...

16  Как преобразовать шестигранную строку в шестнадцатеричный номер?  ( How to convert hex string to hex number ) 
У меня есть целое число в бывшем. 16 И я пытаюсь преобразовать этот номер в шестнадцатеричный номер. Я пытался достичь этого, используя функцию Hex, но всякий...

6  ReportLab 'LayoutError' Обработка и отладки  ( Reportlab layouterror handling and debugging ) 
Я работал с некоторыми сложными выходами PDF с ReportLab. Это, как правило, хорошо, но есть некоторые случаи, где я получаю LayoutErrors - это обычно потому, ...

51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала  ( Pythons requests missing dependencies for socks support when using socks5 fro ) 
Я пытаюсь взаимодействовать с API из My Python 2.7 Shell, используя пакет, который опирается на запросы Python. Вещь - это удаленный адрес блокируется моей се...

1  Как мне позвонить в родительский класс в подклассе?  ( How do i call on a parent class in a subclass ) 
Мне нужно создать вызов несвязанного метода, чтобы установить имя и листья, и я не знаю, как. Любая помощь ценится. Мой код: <код> class Plant(object): ...

0  Запустите сценарий Python в колбу  ( Run python script into flask ) 
У меня есть настольное приложение для обнаружения лиц, написанных в сценарии Python, используя OpenCV и Numpy. Я хочу поставить эти файлы Python в колбу и зап...

9  От CVX до CVXPY или CVXOPT  ( From cvx to cvxpy or cvxopt ) 
Я пытался пройти какой-код из Matlab в Python. У меня такая же проблема с выпуклой оптимизацией, работающая на MATLAB, но у меня возникли проблемы, передавающ...

2  Скапировка не вызывает никакой другой функции после «__init__»  ( Scrapy not calling any other function after init ) 
ОС: Ubuntu 16.04 Стек - Scrapy 1.0.3 + Selenium Я довольно новичок в Scrape, и это может звучать очень простое, но в моем пауке только « init » выполняется. Л...

1  Почему libleosa liblesa.feature.mfcc () выпрыгивает 2D массив?  ( Why does librosa librosa feature mfcc spit out a 2d array ) 
Вызов libleosa.feature.mfcc () в аудиофайле выплесет 2D-массив, как так: <код> array([[ -5.229e+02, -4.944e+02, ..., -5.229e+02, -5.229e+02], [ 7.105...

2  Высокое использование ЦП в ткани 1.0.0  ( High cpu usage in fabric 1 0 0 ) 
в ткани 0,9, все работает нормально, но в 1.0.0, следующий скрипт ткани показывает 100% загрузку CPU в <Код> top : <код> from fabric.api import run def tes...

Связанный проблема

2  Добавьте номера в шестнадцатеричном базе без конвертации баз? 
1  Выполнить файл SQL, возвращать результаты как Pandas DataFrame 
2  Векторный способ применить 3-измерительную маску к RGB в Pytorch 
0  Использование Selenium Python при взаимодействии с веб-сайтом вручную 
0  Почему этот сценарий Python работает на Ubuntu, но не распачин? 
5  Сайт к изображению 
16  Как преобразовать шестигранную строку в шестнадцатеричный номер? 
6  ReportLab 'LayoutError' Обработка и отладки 
51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала 
1  Как мне позвонить в родительский класс в подклассе? 
0  Запустите сценарий Python в колбу 
9  От CVX до CVXPY или CVXOPT 
2  Скапировка не вызывает никакой другой функции после «__init__» 
1  Почему libleosa liblesa.feature.mfcc () выпрыгивает 2D массив? 
2  Высокое использование ЦП в ткани 1.0.0