📜  属性和方法之间有什么区别 (1)

📅  最后修改于: 2023-12-03 15:25:23.892000             🧑  作者: Mango

属性和方法之间的区别

在面向对象编程中,属性和方法是两个不同的概念。虽然它们都是类的成员,但它们的用途和行为是不同的。

属性

属性是类的成员变量,用于保存对象的状态信息。属性可以是公共的(public)、私有的(private)或受保护的(protected)。公共属性可以被类的对象直接访问和修改,而私有属性只能被类的内部方法(例如getters和setters)访问和修改,受保护的属性可以被类和其子类的方法访问和修改。

属性通常用于保存对象的值或状态,例如人的身高、体重等信息都可以保存在人的属性中。

下面是一个Python类中定义属性的示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

在上面的示例中,Person类定义了两个属性:name和age。在对象创建时,它们被初始化为构造函数中传递的值。类还定义了两个getter方法来获取这些属性的值。

方法

方法是类的成员函数,用于执行类的操作。方法可以是公共的、私有的或受保护的。公共方法可以被类的对象直接调用,而私有方法只能被类的内部方法(例如其他方法)调用,受保护的方法可以被类和其子类的方法调用。

方法通常用于执行一些操作,例如将人脸图片转换为数字特征向量。

下面是一个Python类中定义方法的示例:

import cv2

class FaceRecognition:
    def __init__(self):
        self.face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
        self.face_recognizer = cv2.face.LBPHFaceRecognizer_create()

    def train(self, images, labels):
        faces = []
        for image in images:
            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            faces.append(gray)
        
        self.face_recognizer.train(faces, np.array(labels))

    def predict(self, image):
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        faces = self.face_detector.detectMultiScale(gray, 1.3, 5)
        
        for (x,y,w,h) in faces:
            roi_gray = gray[y:y+h, x:x+w]
            label, confidence = self.face_recognizer.predict(roi_gray)

            if confidence < 50:
                return label
        
        return -1

在上面的示例中,FaceRecognition类定义了两个方法:train和predict。train方法用于训练人脸识别器,predict方法用于预测输入图像中的人脸标签。

总结

属性和方法都是类的成员,但它们的用途和行为是不同的。属性用于保存对象的状态信息,方法用于执行类的操作。在编写类时,需要根据类的设计选择合适的属性和方法,以便实现类的功能。