python 类成员函数的self问题

2021-02-03  本文已影响0人  1037号森林里一段干木头

简介: 在一个项目中我希望封装一些opencv的函数,方便自己使用,类里面没有定义成员变量,所以我以为在成员函数里面没必要加self了,然后一直显示参数数目错,这里把工程抽象一下,把问题点提取出来记录一下。

  1. 代码
import cv2 as cv
import numpy as np

class cvtool:
    def showImage(self,img, name="img", waitkeyMode=1, destroyMode=0, windowSizeMode=0):
        if img is None:
            print("In function showImage: the input image is None!")
            return
        cv.namedWindow(name,windowSizeMode)
        cv.imshow(name,img)
        cv.waitKey(waitkeyMode)
        if windowSizeMode != 0:
            cv.destroyWindow(name)

    def canny(img, th1=80, th2=180):
        return cv.Canny(img,th1,th2)

mytool = cvtool()
img = cv.imread("F:\\imagedata\\miniLed\\templateMatch\\src_1.png")
canny = mytool.canny(img, 80, 180)
mytool.showImage(canny,"canny",0)

  1. 报错
Traceback (most recent call last):
  File "del.py", line 21, in <module>
    canny = mytool.canny(img, 80, 180)
TypeError: canny() takes from 1 to 3 positional arguments but 4 were given

  1. 问题
    python类的成员函数必须有一个参数表示对象本身,而且必须是参数列表的第一个,在调用成员函数时,第一个参数是不会被赋值的,传递进来的参数都是从第二个开始赋值。
    例如:
class test:
    def aaaa(first, second=2, third=3):
        print("first:{},second:{},third:{}".format(first,second,third))

t = test()
t.aaaa(1,2)

输出:

(py3) D:\mydoc\python\imageProcess>python del2.py
first:<__main__.test object at 0x00000221EA0A4670>,second:1,third:2

从结果可以看出调用aaaa(1,2)方法时,1没有传给first,而是传给second,first表示的是对象,这是python自动完成的。一般情况下我们都用self表示对象本身,如:def aaa(self,first,second):但是self并不是python的关键字,也就是self可以换成其他任何你想换的名字(除了python关键字),不过为了直观大多数都选择用self了。
4.要修改1.中的bug就很容易了,在类成员函数的参数列表里加上self即可。

def canny(self, img, th1=80, th2=180):
        return cv.Canny(img,th1,th2)
上一篇下一篇

猜你喜欢

热点阅读