如何在类中调用函数?

Posted

技术标签:

【中文标题】如何在类中调用函数?【英文标题】:How to call a function within a class? 【发布时间】:2019-01-29 10:47:28 【问题描述】:

我需要调用第二类中的函数print3()。但我需要从类内部调用但不在任何函数中:

class two:
    y = 2

    def __init__(self):
        print('Login starts')
        self.dict ='a':1, 'b':2, 'c':3, 'd':4

    def print2(self, y):
        print(y)
        print(self.dict)

    def print3(self):
        print('print3')

    print3()

x = two()
x.print2(2)

我得到的错误是:

Traceback (most recent call last):
File "B:/data/loginMech/test 2.py", line 6, in <module>
class two:
File "B:/data/loginMech/test 2.py", line 22, in two
print3()
TypeError: print3() missing 1 required positional argument: 'self'

同样将任何值作为self 传递也不是一个合适的答案。 它实际上是一个网络抓取项目,它有:

from tkinter import *
import mechanicalsoup, random, re, json
# from termcolor import colored
from colorama import Fore,init, Back

init()

class Mygui:
    def window(self, colour='black'):
        loginClass = login()
        self.main_window=Tk()
        self.main_window.geometry('300x100')
        self.main_window.title('Login')
        self.top_frame=Frame(self.main_window)
        self.top_frame.pack()
        self.label=Label(self.top_frame, fg=colour, text="Your Cont", width=45)
        self.label.pack(side="top")
        self.label1=Label(self.top_frame,text=" ", width=45)
        self.label1.pack(side="top")
        self.my_button = Button(self.main_window, text="Retry", command=loginClass,  height=2, width=18)
        self.my_button.pack()

        mainloop()
    def do_something(self):
        print('ok')

class login:
    def __init__(self):
        print('Login starts')
        fp = open('dict.json', 'r')
        self.dict = json.load(fp)
        # key, pas = random.choice(list(dict.items()))
        # print(key, pas)
        self.browser = mechanicalsoup.StatefulBrowser()

    def webloading(self):
        print('webloading starts')

        key, pas = random.choice(list(self.dict.items()))
        # print(key, pas)
        try:
            self.browser.open("http://172.16.16.16:8090/")  # starting of login site
        except:
            print('No connection to Login Page')
            exit()
        self.browser.select_form('form[action="httpclient.html"]')
        self.browser.select_form('form[action="httpclient.html"]')  # form selection from the site
        # a = input('user ')
        # b = input('pass ')
        self.browser['username'] = key  # '1239'
        self.browser['password'] = pas  # ''
        response = self.browser.submit_selected()  # Response of login
        # sText = response.text

        msg = re.compile(r'<message><!\[CDATA\[(.*?)\]').findall(response.text)[0]  # fetching login status using regex
        return msg, key



    print('Login Checking starts')
    msg, key = webloading()
    if msg == 'You have successfully logged in':
        print(Back.YELLOW + Fore.BLUE + 'Logged in with ' + key)
    else:
        webloading()

M = Mygui()
M.window('blue')

对于这个错误,我得到的是:

Login Checking starts
Traceback (most recent call last):
File "B:/data/loginMech/pro2.py", line 26, in <module>
class login:
File "B:/data/loginMech/pro2.py", line 60, in login
msg, key = webloading()
TypeError: webloading() missing 1 required positional argument: 'self'

【问题讨论】:

Python call function within class的可能重复 如果你告诉你为什么需要这个可能会有所帮助。 你希望它做什么? ``print3()` 需要一个实例,当你仍在定义类时,不存在。 这可能不是您想要做的。在您的问题中包含“为什么”,以便提出更好的解决方案。 您希望何时登录?如果您希望在类初始化后立即发生,请编写一个登录方法并从 init 调用它。否则,请尝试解释应该发生的事件顺序,以及作为其中一部分的登录时间。 【参考方案1】: 类中的

def print3() 只是一个声明。因此,当您在类内调用 print3() 时,它不知道它是什么。您需要调用 is 作为实例方法 x.print3() 或在任何其他类方法中调用 print3(),例如在 print2() 中:

【讨论】:

【参考方案2】:

改变

def print3(self):
     print('print3')

def print3():
     print('print3')

注意def prin3(self)的意思是如果方法是静态的,则需要被对象或类调用。

【讨论】:

最后一条评论并不完全正确。 self 只是一个约定名称:它并不完全意味着它将是一个要为其调用的对象或类,甚至不需要调用它self

以上是关于如何在类中调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

在类中引用函数时出现“调用没有匹配函数”

python_如何在类中定义装饰器

用另一个函数(都在类中)调用函数时出现问题。没有错误代码 C++

关于在类中调用PHP函数的一些解释

PHP如何在类中调用另一个文件的类

python 在类中从一个函数中调用另一个函数中的变量