Метод вызова Python в классе

Я пробиваю себе путь выше моего веса, но, пожалуйста, несите этого любителя Python. Я разработчик PHP по профессии, и я уже почти не касался этого языка.

То, что я пытаюсь сделать, это вызвать метод в классе … звучит достаточно просто? Я полностью озадачен тем, что означает «я», и какова правильная процедура для вызова такого метода внутри класса и вне класса.

Может кто-нибудь объяснить мне, как вызвать метод move с переменной RIGHT . Я попытался изучить это на нескольких сайтах «изучать python» и выполнять поиск в StackOverflow, но безрезультатно. Любая помощь будет оценена.

Следующий класс работает в скрипте Скотта Python, к которому обращается терминал GUI (urwid).

Функция, с которой я работаю, – это скрипт Python для ракетной установки Скотта Уэстона, который я пытаюсь подключить к веб-серверу PHP.

 class MissileDevice: INITA = (85, 83, 66, 67, 0, 0, 4, 0) INITB = (85, 83, 66, 67, 0, 64, 2, 0) CMDFILL = ( 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) STOP = ( 0, 0, 0, 0, 0, 0) LEFT = ( 0, 1, 0, 0, 0, 0) RIGHT = ( 0, 0, 1, 0, 0, 0) UP = ( 0, 0, 0, 1, 0, 0) DOWN = ( 0, 0, 0, 0, 1, 0) LEFTUP = ( 0, 1, 0, 1, 0, 0) RIGHTUP = ( 0, 0, 1, 1, 0, 0) LEFTDOWN = ( 0, 1, 0, 0, 1, 0) RIGHTDOWN = ( 0, 0, 1, 0, 1, 0) FIRE = ( 0, 0, 0, 0, 0, 1) def __init__(self, battery): try: self.dev=UsbDevice(0x1130, 0x0202, battery) self.dev.open() self.dev.handle.reset() except NoMissilesError, e: raise NoMissilesError() def move(self, direction): self.dev.handle.controlMsg(0x21, 0x09, self.INITA, 0x02, 0x01) self.dev.handle.controlMsg(0x21, 0x09, self.INITB, 0x02, 0x01) self.dev.handle.controlMsg(0x21, 0x09, direction+self.CMDFILL, 0x02, 0x01) 

3 Solutions collect form web for “Метод вызова Python в классе”

Первый аргумент всех методов обычно называется « self . Он ссылается на экземпляр, для которого вызывается метод.

Допустим, у вас есть:

 class A(object): def foo(self): print 'Foo' def bar(self, an_argument): print 'Bar', an_argument 

Затем, делая:

 a = A() a.foo() #prints 'Foo' a.bar('Arg!') #prints 'Bar Arg!' 

Нет ничего особенного в том, что это называется « self , вы можете сделать следующее:

 class B(object): def foo(self): print 'Foo' def bar(this_object): this_object.foo() 

Затем, делая:

 b = B() b.bar() # prints 'Foo' 

В вашем конкретном случае:

 dangerous_device = MissileDevice(some_battery) dangerous_device.move(dangerous_device.RIGHT) 

(Как предложено в комментариях MissileDevice.RIGHT может быть более уместным здесь!)

Вы могли бы объявить все свои константы на уровне модуля, чтобы вы могли:

 dangerous_device.move(RIGHT) 

Это, однако, будет зависеть от того, как вы хотите, чтобы ваш код был организован!

Допустим, у вас блестящий класс Foo. У вас есть 3 варианта:

1) Вы хотите использовать метод (или атрибут) класса внутри определения этого класса:

 class Foo(object): attribute1 = 1 # class attribute (those don't use 'self' in declaration) def __init__(self): self.attribute2 = 2 # instance attribute (those are accessible via first # parameter of the method, usually called 'self' # which will contain nothing but the instance itself) def set_attribute3(self, value): self.attribute3 = value def sum_1and2(self): return self.attribute1 + self.attribute2 

2) Вы хотите использовать метод (или атрибут) класса вне определения этого класса

 def get_legendary_attribute1(): return Foo.attribute1 def get_legendary_attribute2(): return Foo.attribute2 def get_legendary_attribute1_from(cls): return cls.attribute1 get_legendary_attribute1() # >>> 1 get_legendary_attribute2() # >>> AttributeError: type object 'Foo' has no attribute 'attribute2' get_legendary_attribute1_from(Foo) # >>> 1 

3) Вы хотите использовать метод (или атрибут) экземпляра класса:

 f = Foo() f.attribute1 # >>> 1 f.attribute2 # >>> 2 f.attribute3 # >>> AttributeError: 'Foo' object has no attribute 'attribute3' f.set_attribute3(3) f.attribute3 # >>> 3 

Может ли кто-нибудь объяснить мне, как вызвать метод перемещения с переменной RIGHT

 >>> myMissile = MissileDevice(myBattery) # looks like you need a battery, don't know what that is, you figure it out. >>> myMissile.move(MissileDevice.RIGHT) 

Если вы запрограммировали на любом другом языке с классами, помимо python, такого рода вещи

 class Foo: bar = "baz" 

вероятно, незнакомы. В python класс является фабрикой для объектов, но сам по себе является объектом; и переменные, определенные в его области, привязаны к классу , а не экземпляры, возвращаемые классом. для обозначения bar , выше, вы можете просто назвать его Foo.bar ; вы также можете получить доступ к атрибутам класса через экземпляры класса, например, Foo().bar .


Я совершенно озадачен тем, что означает «я»,

 >>> class Foo: ... def quux(self): ... print self ... print self.bar ... bar = 'baz' ... >>> Foo.quux <unbound method Foo.quux> >>> Foo.bar 'baz' >>> f = Foo() >>> f.bar 'baz' >>> f <__main__.Foo instance at 0x0286A058> >>> f.quux <bound method Foo.quux of <__main__.Foo instance at 0x0286A058>> >>> f.quux() <__main__.Foo instance at 0x0286A058> baz >>> 

Когда вы acecss атрибут объекта python, интерпретатор заметит, когда атрибут look up был в классе и является функцией, что он должен возвращать «привязанный» метод вместо самой функции. Все это означает, что экземпляр должен быть передан в качестве первого аргумента.

  • Контекстно-зависимый метод в Python - что я делаю неправильно?
  • Открытый метод Python TypeError
  • Как получить все методы класса python с заданным декоратором
  • объект привязанного и несвязанного метода python
  • превратить смешанный список в строку, сохранить кавычки только для строк
  • Динамически назначать специальные методы для объектов, но не классы в Python
  • Предпочтительный способ динамического вызова метода какого-либо объекта
  • Добавление атрибутов к методам экземпляра в Python
  •  
    Interesting Posts for Van-Lav

    Django: сигнал, когда пользователь входит в систему?

    Как интегрировать SQLAlchemy и подклассифицированный Numpy.ndarray плавно и в виде pythonic?

    if else statment, не соответствующий elif правильно

    Каков наилучший вариант для очереди задач (Python 3) в Windows теперь, когда Celery 4 отказался от поддержки Windows?

    как открыть две вкладки в python splinter

    Как работают operator.itemgetter и sort () в Python?

    GAE Python: статические файлы не загружаются в localhost, но загружаются отлично, когда приложение развертывается на appspot

    Лучший способ конвертировать URL-адрес Unicode в ASCII (UTF-8-escaped) в Python?

    Представление уравнения в виде объекта canvas в Tkinter

    Рисование пользовательской диаграммы в python

    Упорядоченные списки в джанго

    Что возвращает метод __init__ в python

    Пропустить заголовки при редактировании файла csv с помощью Python

    pivot_table Нет числовых типов для агрегирования

    Сравнение двух списков координат в python и использование значений координат для назначения значений

    Python - лучший язык программирования в мире.