Вызов метода класса повышает TypeError в Python

MySQL: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с ... at line ...

Эта ошибка часто возникает из-за того, что вы забыли правильно удалить данные, переданные в MySQL-запрос .

Пример того, что не делать («Плохая идея»):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Этот код может быть включен в страницу с формой для отправки с URL-адресом например http://example.com/edit.php?id=10 (для редактирования сообщения n ° 10)

Что произойдет, если представленный текст содержит одинарные кавычки ? $query закончится:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

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

Чтобы избежать таких ошибок, вы ДОЛЖНЫ всегда избегать данных перед использованием в запросе.

Экранирование данных перед использованием в SQL-запросе также очень важно, потому что если вы этого не сделаете, ваш скрипт будет быть открытым для инъекций SQL. SQL-инъекция может привести к изменению, потере или изменению записи, таблицы или всей базы данных. Это серьезная проблема безопасности!

Документация:

71
задан Adam Liss 27 December 2018 в 22:52
поделиться

6 ответов

Можно инстанцировать класса путем объявления переменной и вызова класса, как будто это была функция:

x = mystuff()
print x.average(9,18,27)

Однако это не будет работать с кодом, который Вы дали нам. При вызове метода класса для данного объекта (x) это всегда передает указатель на объект как первый параметр, когда это вызывает функцию. Таким образом, при выполнении кода прямо сейчас Вы будете видеть это сообщение об ошибке:

TypeError: average() takes exactly 3 arguments (4 given)

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

87
ответ дан Ryan 24 November 2019 в 13:00
поделиться

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

class mystuff:
  @staticmethod
  def average(a,b,c): #get the average of three numbers
    result=a+b+c
    result=result/3
    return result

print mystuff.average(9,18,27)

Обратите внимание на то, что тяжелое использование статических методов в Python обычно является признаком некоторого неприятного запаха - если Вы действительно нуждаетесь в функциях, затем объявляете их непосредственно на уровне модуля.

34
ответ дан rob 24 November 2019 в 13:00
поделиться

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

class mystuff:
    def average(a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result
    def sum(self,a,b):
            return a+b


print mystuff.average(9,18,27) # should raise error
print mystuff.sum(18,27) # should be ok

, Если переменные класса включены:

 class mystuff:
    def setVariables(self,a,b):
            self.x = a
            self.y = b
            return a+b
    def mult(self):
            return x * y  # This line will raise an error
    def sum(self):
            return self.x + self.y

 print mystuff.setVariables(9,18) # Setting mystuff.x and mystuff.y
 print mystuff.mult() # should raise error
 print mystuff.sum()  # should be ok
4
ответ дан Community 24 November 2019 в 13:00
поделиться

Необходимо провести немного больше времени на некоторых основных принципах объектно-ориентированного программирования.

Это звучит резким, но это важно.

  • Ваше определение класса является неправильным - хотя синтаксис, оказывается, приемлем. Определение является просто неправильным.

  • Ваше использование класса для создания объекта является совершенно недостающим.

  • Ваше использование класса, чтобы сделать вычисление является несоответствующим. Такого рода вещь может быть сделана, но она требует усовершенствованного понятия @staticmehod.

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

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

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

Вы могли бы хотеть посмотреть http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html для лучшего введения в классы, объекты и Python.

1
ответ дан S.Lott 24 November 2019 в 13:00
поделиться

В функции членства Python класса нуждаются явный self аргумент. То же как неявный this указатель в C++. Для получения дополнительной информации проверьте этот страница.

1
ответ дан Bill the Lizard 24 November 2019 в 13:00
поделиться

Вы никогда не создавали экземпляр.

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

-2
ответ дан Aaron Maenpaa 24 November 2019 в 13:00
поделиться
Другие вопросы по тегам:

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