在类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, inFunction_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中定义函数的正确方法的主要内容,如果未能解决你的问题,请参考以下文章