初识python中的类与对象
- 编程知识
- 2023-06-11
- 2
本文将从以下几个方面,详细阐述初识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!”。