在类python中定义函数的正确方法

Posted

技术标签:

【中文标题】在类python中定义函数的正确方法【英文标题】:proper way to define functions inside class python 【发布时间】:2022-01-01 19:12:40 【问题描述】:

我是 python 的新手,我有一些与 dll 库(C 语言)接口的 python 代码。 我的 python 代码现在可以正常工作,但有人告诉我将一些初始化实现到它们自己的函数中。例如,我目前拥有的是:

你好.py

import ctypes

class my_outer_class:

    def __init__(self):

        test = ctypes.WinDLL('C:\\Users\OneDrive\HelloWorld\HelloWorld\loc\Debug\HelloWorld.dll')

        self.py_function_1 = test.function_1
        self.py_function_1.argtype = (ctypes.c_uint8,ctypes.c_uint8 )
        self.py_function_1.restype = ctypes.c_int

        self.py_function_2 = test.function_2
        self.py_function_2.argtype = (ctypes.c_uint8,ctypes.c_uint8 )
        self.py_function_2.restype = ctypes.c_int

run_test.py

import hello
import ctypes

myapi = hello.my_outer_class()
            
result = myapi.py_function_1(123,123)
print(result)

result = myapi.py_function_2(123,123)
print(result)

我想知道是否可以将我的 hello.py 更改为:

你好.py

import ctypes

class my_outer_class:

    def __init__(self):

        test = ctypes.WinDLL('C:\\Users\OneDrive\HelloWorld\HelloWorld\loc\Debug\HelloWorld.dll')

        def func_1(self):
            self.py_function_1 = test.function_1
            self.py_function_1.argtype = (ctypes.c_uint8,ctypes.c_uint8 )
            self.py_function_1.restype = ctypes.c_int

        def func_2(self):
            self.py_function_2 = test.function_2
            self.py_function_2.argtype = (ctypes.c_uint8,ctypes.c_uint8 )
            self.py_function_2.restype = ctypes.c_int

run_test.py

import hello
import ctypes

myapi = hello.my_outer_class()
            
result = myapi.func_1(123,123)
print(result)

result = myapi.func_2(123,123)
print(result)

当我运行修改后的版本时出现错误:

Traceback (most recent call last):
  File "C:\Users\OneDrive\run_test.py", line 6, in <module>
    result = myapi.func_1(123,123)
AttributeError: 'my_outer_class' object has no attribute 'func_1'
>>> 

感谢任何建议,谢谢。

修改 hello.py 为

import ctypes

class my_outer_class:

    def __init__(self):

        self.test = ctypes.WinDLL('C:\\Users\giova\OneDrive\Escritorio\HelloWorld\HelloWorld\loc\Debug\HelloWorld.dll')

    def func_1(self, var1, var2):
        self.py_function_1 = self.test.function_1
        self.py_function_1.argtype = (ctypes.c_uint8,ctypes.c_uint8 )
        self.py_function_1.restype = ctypes.c_int

    def func_2(self, var1, var2):
        self.py_function_2 = self.test.function_2
        self.py_function_2.argtype = (ctypes.c_uint8,ctypes.c_uint8 )
        self.py_function_2.restype = ctypes.c_int

和 run_test.py

import hello
import ctypes

myapi = hello.my_outer_class()
            
result = myapi.func_1(123,123)
print(result)

result = myapi.func_2(123,123)
print(result)

此时我没有收到任何错误,我得到了这个输出

None
None
>>> 

而不是预期值 1 和 0。我能够在我的代码的第一个版本中获得这些值。 “self”旁边的其他两个参数是否也需要与我在 argtype 下的参数相匹配?例如

def func_1(self, ctypes.c_uint8, ctypes.c_uint8):

因为我尝试过这种方式,但它给了我一个无效的语法错误。

   def func_1(self, ctypes.c_uint8, ctypes.c_uint8):
                           ^
SyntaxError: invalid syntax 

【问题讨论】:

注意它是.argtypes(复数)而不是.argtype 【参考方案1】:

基本上,您在这里遇到了缩进问题。

请在您的班级中重新缩进您的 func x 以使其外部可访问。这是一个简短的说明:

class my_outer_class:

    def __init__(self):
        print("initiated")

    def func_1(self):
        print("Hello FUNC_1")

    def func_2(self):
        print("Hello FUNC_2")

myapi = my_outer_class()

myapi.func_1()
myapi.func_2()

要更深入地了解 Python 中的类和面向对象编程,您可以从以下内容开始:https://python-textbok.readthedocs.io/en/1.0/Classes.html

【讨论】:

我按照建议缩进了,但是我得到了一个错误 Traceback (last recent call last): File "C:\Users\OneDrive\run_test.py", line 6, in result = myapi. func_1(123,123) TypeError: func_1() 接受 1 个位置参数,但给出了 3 个 您必须为类的函数定义参数,例如:Function_1(self, var_1, var_2)。请参阅文档以获得更深入的了解:docs.python.org/3/glossary.html#term-function @pekoms 这与您合作吗?如果可以,请您同意这个答案。 对不起。我最新的代码更新在帖子上。 var1 和 var2 是任意的还是必须匹配这一行 self.py_function_1.argtype = (ctypes.c_uint8,ctypes.c_uint8 )。我能够解决错误,但现在我在运行代码时只得到“无”。 @pekoms ,我相信如果您解决了错误,您应该接受这个答案并创建一个新答案,因为它与当前范围无关,我会尽力做出适当的回应。你不应该改变你的问题的范围,一开始它是与 python 类相关的。

以上是关于在类python中定义函数的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

python之self

python中的self

Python--创建类的方法与成员访问

Python类私有方法的陷阱

Boost.Python:在类外定义构造函数

Python面向对象基础