当前位置:首页 > 编程知识 > 正文

初识python中的类与对象

本文将从以下几个方面,详细阐述初识Python中的类与对象:

一、类与对象的概念及定义

类是面向对象程序设计(OOP)中的概念,是对具有相同属性和方法的对象的抽象。Python中定义一个类通过关键字class(类名通常以驼峰式命名)。

class MyClass:
    pass

上面这个例子就定义了一个名为MyClass的空类,假如我们要在类中定义属性和方法,那么就这样写:

class MyClass:
    var = 10
    def func():
        return 'Hello, World!'

这个类中定义了一个var属性,赋值为10,同时定义了一个返回“Hello, World!”的func方法。

而实例则是由类创建出的对象,具有类所定义的属性和方法。我们可以用以下方式创建一个实例:

obj = MyClass()

这条语句会使用MyClass中定义的代码创建一个名为obj的实例。

二、类的属性与方法

在Python的类中,属性和方法都是类级别的,这意味着一个类的所有属性和方法都是共享的,每个实例都可以访问,并且可以修改。属性和方法区别在于,属性是一个固定的值,而方法则是一个可以操作类的调用的函数。

定义实例属性的方法通常是在类的构造函数中定义:

class MyClass:
    def __init__(self):
        self.var = 10

这个类中定义了一个名为var的实例属性,赋值为10。我们可以这样访问实例的属性:

obj = MyClass()
print(obj.var)  # 输出10

定义类属性通常是在类之外直接定义:

class MyClass:
    pass
MyClass.var = 10

这个类中定义了一个名为var的类属性,赋值为10。我们可以这样访问类的属性:

print(MyClass.var)  # 输出10

定义实例方法也是在类的构造函数中定义:

class MyClass:
    def __init__(self):
        self.var = 10
    def func(self):
        return 'Hello, World!'

这个类中定义了一个名为func的方法,该方法返回“Hello, World!”。我们可以这样调用实例方法:

obj = MyClass()
print(obj.func())  # 输出Hello, World!

而定义类方法需要使用一个特殊的装饰器@classmethod:

class MyClass:
    var = 10
    @classmethod
    def class_func(cls):
        return cls.var

注意这里的cls,它代表调用类本身,也就是这个方法不是针对某个实例调用的。我们可以这样调用类方法:

print(MyClass.class_func())  # 输出10

三、继承

在面向对象编程中,继承是一个重要的概念,它使代码的重用更加容易,同时可以让代码更加可靠和健壮。Python支持多重继承,这意味着一个子类可以从多个基类中继承。下面是一个简单的继承示例:

class MyBaseClass:
    var = 10
    def func(self):
        return 'Hello, World!'
class MyChildClass(MyBaseClass):
    pass

这里,我们定义了一个名为MyBaseClass的类,其中包含一个var属性和一个func方法。然后我们定义了一个名为MyChildClass的类,它从MyBaseClass继承(使用关键字class MyClass(MyBaseClass):)。这意味着MyChildClass现在有一个var属性和一个func方法,它们都是从MyBaseClass继承来的。

四、封装

封装是面向对象编程中实现数据封装的一个概念。它的目的是将代码等同于“黑盒子”,让使用者无需关心它的内部实现。Python中通过定义类属性和方法的访问级别来实现封装。

Python中定义属性和方法的访问级别分别有:公共的public、私有的private、受保护的protected。

在Python中,Public属性和方法是默认的,可以通过类或对象访问。在方法或属性名前加上双下划线“__”可使其变为私有的。受保护的属性和方法的名称前加上单下划线“_”,但这仅仅只是一种约定。

以下是一个演示封装的Python类:

class MyClass:
    def __init__(self):
        self.__private_var = 'I am a private variable!'
        self.public_var = 'I am a public variable!'
    def __private_method(self):
        return 'I am a private method!'
    def public_method(self):
        return self.__private_var, self.__private_method()

在这个类中,我们定义了一个双下划线作为前缀的private_var和private_method,并定义了一个public_var和public_method。注意这里的双下划线将实例属性和方法私有化了,因此无法从实例的外部直接访问。但是我们可以通过public_method调用private_var和private_method:

obj = MyClass()
print(obj.public_var)  # 输出I am a public variable!
print(obj.public_method())  # 输出('I am a private variable!', 'I am a private method!')

五、多态

多态是指在不同的对象类型上执行相同的操作,会出现不同的结果。可以通过继承和封装来实现多态。以下是一个演示多态的Python代码:

class MyParentClass:
    def func(self):
        return 'I am the parent class!'
class MyChildClass(MyParentClass):
    def func(self):
        return 'I am the child class!'
def poly_func(obj):
    return obj.func()
parent_obj = MyParentClass()
child_obj = MyChildClass()
print(poly_func(parent_obj))  # 输出I am the parent class!
print(poly_func(child_obj))  # 输出I am the child class!

这里我们首先定义了一个MyParentClass类,其中包含一个名为func的方法,它返回一条字符串消息。然后我们定义了一个MyChildClass类,它从MyParentClass中继承了func方法,并实现了自己的版本。

最后,我们定义了一个名为poly_func的函数,并且它能够接受任意的子类的实例。当我们传递MyParentClass实例时,它执行了MyParentClass类中的func()方法,并返回了“I am the parent class!”。当我们传递MyChildClass实例时,它执行了MyChildClass类中的func()方法,并返回了“I am the child class!”。