Ошибка связанного метода в Python возникает, когда есть какая-то проблема с вызовом функции в вашем коде. Изначально в Python было два типа вызовов функций: связанные и несвязанные. Когда Python был обновлен до Python 3, несвязанный метод был удален, чтобы сделать вызовы функций более плавными и простыми в исполнении, а также избежать ненужных ошибок.
Существует не так много информации о том, почему эта функция была изменена в ходе эволюции Python, но между двумя вызовами функций есть существенная разница.
В этой статье мы выясним возможные причины ошибки «привязанный метод» и как мы можем ее исправить.
Ошибка «связанного метода» в Python обычно возникает, когда в вызове метода отсутствуют круглые скобки. Эта ошибка была более распространена в Python 2, но Python 3 по умолчанию предполагает все функции как связанные методы. Обязательно используйте круглые скобки при вызове функций, чтобы предотвратить такие ошибки.
Когда сорт или метод связан с объектом, он называется связанным методом. Их также называют методом экземпляра, потому что с ними связан экземпляр. Этим классам нужны аргументы, когда они определены.
ПО умолчанию их первым аргументом является self. На них может влиять состояние экземпляра. Когда методы вызываются для экземпляров, они имеют доступ к данным экземпляра, для которого они вызываются.
В Python 3 все функции по умолчанию являются связанными функциями. Даже если он не упоминается, объект self передается в качестве первого аргумента методу __init__ во время инициализации экземпляра в Python. Чтобы узнать больше о файлах инициализации, нажмите здесь.
Например, предположим, что у нас есть класс фруктов, различными атрибутами фруктов будут его имя, цвет, цена и т. д.
Давайте посмотрим, как создавать пользовательские классы в Python.
# defining a fruit class here class fruit: # initialization function def __init__(self, name, price, color): # three parameters name, color, price self.name = name self.price = price self.color = color # function for only displaying price def pricefruit(self): print("The price of ", self.name, "is= ", self.price) # function for only displaying name def namefruit(self): print("The fruit you entered is= ", self.name) # function for only displaying color def colorfruit(self): print("the color of ", self.name, "is= ", self.color) # function for displaying everything def displayall(self): print("The fruit is=", self.name) print("It's color is=", self.color) print("It's price is= ", self.price) # driver code # taking user input name, color, price = input( "enter the name of the fruit, it's colour and it's price per kilo separated by a comma respectively= " ).split(",") # calling our class instance fruits = fruit(name, price, color) # calling the display all function fruits.displayall() print("All the features individually are:") # calling the price function only fruits.pricefruit() # calling the name function only fruits.namefruit() # calling the color function only fruits.colorfruit()
Это наш классный фрукт. Это пример объектно-ориентированного программирования на Python, поскольку объект определяется различными функциями, такими как цвет, цена и имя.
Это очень простой пример определяемого пользователем класса. По мере продвижения в своем путешествии по программированию вы столкнетесь со многими такими классами, а также создадите их! Это одно из самых больших преимуществ Python как объектно-ориентированного языка программирования с одним из самых простых синтаксисов.
Результат будет:
enter the name of the fruit, it's colour and it's price per kilo separated by a comma respectively= pomegranate,red,130 The fruit is= pomegranate It's color is= red It's price is= 130 All the features individually are: The price of pomegranate is= 130 The fruit you entered is= pomegranate the color of pomegranate is= red
Узнайте больше о классах и объектах Python здесь!
Основная причина ошибки «Привязанный метод» Python
Поскольку все функции в Python 3 по умолчанию являются связанными экземплярами, вы не можете объявлять несвязанные или статические методы. Ошибка «связанный метод» возникает, когда вы забыли пару круглых скобок или пару круглых скобок в конце имени функции.
Это была очень распространенная ошибка в Python2, но в настоящее время в некоторых редакторах вызовы функций работают с отсутствующими круглыми скобками. Тем не менее рекомендуется включать пару круглых скобок после объявления вызова функции, чтобы избежать ненужных ошибок.
В других языках, которые гораздо более жесткие, чем python, отсутствующие круглые скобки обязательно вызовут ошибку, из-за которой программа снова и снова просматривает свой код, тратя впустую драгоценное время.
Поскольку это не так очевидно, как ошибка, это может сбить вас с толку на минуту, потому что может просто сказать что-то вроде того, что показано ниже:
<bound method fruit.namefruit of <__main__.fruit object at 0x108534080>>
Проверенные исправления ошибки «Привязанный метод»
Самое простое решение этой проблемы — потренироваться ставить круглые скобки при вызове функции, так как это в основном сводится к знанию синтаксиса программиста и его структуре кода. Вместо того, чтобы писать, fruit.namefruit
для вызова функции попрактикуйтесь в написании fruit.namefruit()
.
Примечание: в некоторых IDE эта ошибка была полностью устранена, и вызовы функций работают даже при отсутствии пары круглых скобок. Но чтобы быть в безопасности и привить привычку хорошо кодировать, используйте круглые скобки всякий раз, когда вы вызываете функцию.
Это также можно исправить с помощью блока try и exclude, как и с любой другой обработкой исключений. Но вам следует избегать этого, потому что это само по себе не решает проблему, а скорее подавляет ее.
try: fruit.namefruit except AttributeError: print("Please put parenthesis at the end of function name!")
Предупреждение. Этот метод try and exc может быть реализован не во всех системах, и вы можете снова и снова сталкиваться с одним и тем же, или это может привести к большему количеству ошибок. Следовательно, чтобы избежать ошибки и избежать написания лишнего ненужного кода, просто используйте круглые скобки, обработка исключений вообще не требуется. Практикуйтесь в написании ясного и точного кода с комментариями рядом с каждой строкой, чтобы легко отлаживать его в будущем.
В двух словах: связанные методы в Python
Связанные и несвязанные методы уже давно объединены в один после того, как Python2 был обновлен до Python3. В настоящее время в python существуют только связанные методы, которые ссылаются на ассоциацию объектов по умолчанию, когда функция определена на этом языке программирования. Обычно это делается через параметр self, в большинстве случаев невидимый при вызове функции. Чтобы избежать странных адресов привязанных методов, как упоминалось в предыдущем разделе, всегда используйте круглые скобки. Это хорошая практика программирования. Как вы думаете, какие еще мельчайшие синтаксические детали можно считать хорошей практикой программирования?
There’s no error here. You’re printing a function, and that’s what functions look like.
To actually call the function, you have to put parens after that. You’re already doing that above. If you want to print the result of calling the function, just have the function return the value, and put the print there. For example:
print test.sort_word_list()
On the other hand, if you want the function to mutate the object’s state, and then print the state some other way, that’s fine too.
Now, your code seems to work in some places, but not others; let’s look at why:
parser
sets a variable calledword_list
, and you laterprint test.word_list
, so that works.sort_word_list
sets a variable calledsorted_word_list
, and you laterprint test.sort_word_list
—that is, the function, not the variable. So, you see the bound method. (Also, as Jon Clements points out, even if you fix this, you’re going to printNone
, because that’s whatsort
returns.)num_words
sets a variable callednum_words
, and you again print the function—but in this case, the variable has the same name as the function, meaning that you’re actually replacing the function with its output, so it works. This is probably not what you want to do, however.
(There are cases where, at first glance, that seems like it might be a good idea—you only want to compute something once, and then access it over and over again without constantly recomputing that. But this isn’t the way to do it. Either use a @property
, or use a memoization decorator.)
The bound method error in Python occurs when there is some problem with the function call in your code. Initially, there were two types of function calls in Python, bound and unbound. When Python was updated to Python 3, the unbound method was removed to make function calls smoother and easier to execute and to avoid unnecessary errors.
There is not much information about why this feature was changed during the evolution of Python, but there is a significant difference between the two function calls.
In this article, we will find out the possible causes of the “bound method” error and how we can fix it.
The ‘bound method’ error in Python generally occurs when a method call is missing parentheses. This error was more prevalent in Python 2, but Python 3, by default, assumes all functions as bound methods. Ensure to use parentheses when calling functions to prevent such errors.
Exploring Bound Methods in Python
When a class or method is associated with an object it is called a bound method. They are also called instance method because they have a instance associated with them. These classes need arguments when they are defined.
BY default, their first argument is self. They can be influenced by the state of the instance. When methods are called on instances, they have access to the data of the instance they are called on.
In Python 3, all functions are by default bound functions. Even when not mentioned, the self object is passed as the first argument to the __init__ method during the instance initialization in Python. To know more about initialization files, click here.
For example, let’s say we have a fruit class, the various attributes of the fruit are going to be its name, color, price etc.
Let’s take a look at how to create user defined classes in Python.
# defining a fruit class here class fruit: # initialization function def __init__(self, name, price, color): # three parameters name, color, price self.name = name self.price = price self.color = color # function for only displaying price def pricefruit(self): print("The price of ", self.name, "is= ", self.price) # function for only displaying name def namefruit(self): print("The fruit you entered is= ", self.name) # function for only displaying color def colorfruit(self): print("the color of ", self.name, "is= ", self.color) # function for displaying everything def displayall(self): print("The fruit is=", self.name) print("It's color is=", self.color) print("It's price is= ", self.price) # driver code # taking user input name, color, price = input( "enter the name of the fruit, it's colour and it's price per kilo separated by a comma respectively= " ).split(",") # calling our class instance fruits = fruit(name, price, color) # calling the display all function fruits.displayall() print("All the features individually are:") # calling the price function only fruits.pricefruit() # calling the name function only fruits.namefruit() # calling the color function only fruits.colorfruit()
This is our class fruit. It is an example of object oriented programming in Python since the object is defined by various features such as it’s color, price and name.
This is a very basic example of a user defined class, as you move ahead in your programming journey you’ll come across many such classes and will also create them! This is one of the biggest advantages of Python being an object oriented programming language with one of the most easiest syntax.
The output would be:
enter the name of the fruit, it's colour and it's price per kilo separated by a comma respectively= pomegranate,red,130 The fruit is= pomegranate It's color is= red It's price is= 130 All the features individually are: The price of pomegranate is= 130 The fruit you entered is= pomegranate the color of pomegranate is= red
Read more about Python Classes and Objects here!
Root Cause of Python’s ‘Bound Method’ Error
Since all of the functions in Python 3 are bound instances by default, you cannot declare unbound or static methods. The “bound method” error arises when you forget a pair of round brackets or a pair of parentheses at the end of the function name.
This was a very common error in Python2, but nowadays in some editors the function calls work with the missing parentheses. Nonetheless, it is a good practice to include the pair of round brackets after declaring a function call to keep unnecessary errors at bay.
In other languages which are much more rigid than python, a missing parentheses will definitely raise an error leading the program to go through their code over and over again wasting precious time.
Since it is not so obvious as a error, it might confuse you for a minute because it might just say something like the one shown below:
<bound method fruit.namefruit of <__main__.fruit object at 0x108534080>>
Proven Fixes for the ‘Bound Method’ Error
The easiest fix to this is to practice putting parentheses when calling function, since it mainly comes down to the syntax knowledge of the programmer and their code structure. Instead of writing, fruit.namefruit
for calling the function, practice writing fruit.namefruit()
.
Note: in some IDEs this error has been removed completely and function calls even work when the pair of round brackets in missing. But to be on the safe side and to inculcate a habit of good coding, use the parenthesis whenever you call a function.
It can be also fixed using the try and except block as we do with any other exception handling. But you should avoid doing this because this doesn’t in itself solve the problem but rather suppress it.
try: fruit.namefruit except AttributeError: print("Please put parenthesis at the end of function name!")
Warning:- This try and except method might not be feasible on all systems and you might encounter the same thing over and over again or it might lead to more errors. Hence to avoid the error and to avoid writing extra, unnecessary code, just use parenthesis, the exception handling is not required at all. Practice writing clear and precise code with comments beside every line in order to easily debug it in the future.
In a Nutshell: Bound Methods in Python
Bound and unbound methods have long been merged into one after Python2 got upgraded to Python3. Nowadays, only bound methods exist in python which refers to a default object association when a function is defined in this programming language. It is usually done via the self parameter, most of the time invisible when the function is called. To avoid getting weird bound method addresses as mentioned in the above section, always use parentheses. It is good programming practice. What other minute syntactical details do you think can be considered as good programming practices?
Issue
I have written a Python script which logs into my E-Mail account and sends some messages automatically.
After having tested the code which worked, I wanted to simplify it (add one-liners, reduce number of local variables…). After the changes it was not working as I have expected. The full error message was:
<bound method WebElement.click of
<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fa50a977-d210-
4c7f-a836-080014cb9209", element="2548584a-e638-47fd-b40b-615516d0e9c6")>>
I am just going to post the beginning of the my script, to the point where the first error occured. When I understand how to avoid the first error, I can fix the rest of the code.
This code snippet of the beginning of my code worked:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox()
browser.get('https://protonmail.com/')
loginButton = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn-ghost:nth-child(1)")))
loginButton.click()
I changed it to the following code which does not work:
browser = webdriver.Firefox()
browser.get('https://protonmail.com/')
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn-ghost:nth-child(1)"))).click()
Obviously, I violated some basic Python programming rule here. Can anyone explain to me, what is wrong with the second code snippet and why this type of error occurs?
Solution
As mentioned by pcalkins in a comment this is a typo here.
You are using .click
method instead of .click()
method.
So instead of
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn-ghost:nth-child(1)"))).click
It should be
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn-ghost:nth-child(1)"))).click()
I would like to advice you to use visibility_of_element_located
expected conditions each time this would be relevant rather than presence_of_element_located
. Since presence_of_element_located
may return you an element while it is still not completely loaded, only existing on the page while visibility_of_element_located
will wait for the element visibility that is more mature element state when it is already visible, clickable etc.
Answered By — Prophet
Ошибка ‘bound method’ является одной из наиболее распространенных ошибок, с которыми сталкиваются программисты при разработке программного обеспечения на языке программирования Python. В этой статье мы рассмотрим, что такое ошибка ‘bound method’, как ее определить и как исправить.
Прежде чем мы начнем, давайте разберемся, что такое метод в Python. Метод представляет собой функцию, определенную внутри класса, и вызывается с использованием экземпляра этого класса. Метод имеет доступ к атрибутам и функциональности класса и может быть вызван для выполнения определенной операции над экземпляром класса или его атрибутами.
Теперь перейдем к понятию ‘bound method’. Ошибка ‘bound method’ возникает в том случае, когда метод класса вызывается как обычная функция, без использования экземпляра класса. Когда метод вызывается без экземпляра класса, он не имеет доступа к данным класса, таким образом, возникает ошибка.
Лучше всего проиллюстрировать эту ошибку примером кода. Допустим, у нас есть класс ‘Кошка’, который имеет метод ‘мяукать’.
class Cat: def __init__(self, name): self.name = name def meow(self): print("Мяу!")
Теперь, если мы попытаемся вызвать метод ‘meow’ как обычную функцию, мы получим ошибку ‘bound method’.
Cat.meow() # Ошибка: TypeError: unbound method meow() must be called with Cat instance as first argument (got nothing instead)
Ошибка указывает на то, что метод ‘meow’ должен быть вызван с экземпляром класса ‘Cat’ в качестве первого аргумента.
Чтобы исправить эту ошибку, мы должны вызывать метод ‘meow’ с использованием экземпляра класса ‘Cat’. Давайте создадим экземпляр класса ‘Cat’ и вызовем метод ‘meow’.
cat = Cat("Барсик") cat.meow() # Вывод: Мяу!
Теперь, когда мы вызываем метод ‘meow’ с использованием экземпляра класса ‘Cat’, ошибка ‘bound method’ не возникает.
Чтобы избежать ошибки ‘bound method’, убедитесь, что вы правильно вызываете методы класса с использованием экземпляров этого класса. Если вы все еще сталкиваетесь с этой ошибкой, убедитесь, что у вас есть правильные экземпляры класса, с которыми вы работаете.
Итак, мы рассмотрели, что такое ошибка ‘bound method’ в Python и как ее исправить. Надеюсь, эта статья помогла вам лучше понять эту проблему и избежать ее в будущем. Удачи с программированием!