3.1 创建类
在Python中创建类是面向对象编程(OOP)的重要部分。类允许创建新的数据类型, 这些数据类型可以具有自己的属性和方法。让我们看看Python中创建类的基本概念和示例。
基本概念
- 类: 创建对象的模板。类定义将由该类对象拥有的属性和方法。
- 对象: 类的实例。对象具有类中定义的所有属性和方法。
- 属性: 与类或对象关联的变量。
- 方法: 与类或对象关联的函数。
属性 本质上是对象或类的内部变量。方法 是在类中定义的函数。 这些术语来自OOP,并与函数和变量一起使用。
要声明(创建)新类,可以使用关键字class
。
通常的语法如下:
class ClassName:
variable1 = value1
variableN = valueN
def method1(self):
function code
def methodM(self):
function code
基本上,可以说类是一个小程序(变量+函数),放在一个命名的空间中 — ClassName。
创建类之后,可以创建该类的对象(实例)。这段代码看起来更加简单:
variableX = ClassName()
重要!
在Python中通常使用小写字母来编写变量和方法名。类名则使用大写字母。
此外,类名中不使用下划线。如果类名由多个单词组成,则每个单词的首字母都大写。
如果想要访问类/对象的变量,代码通常如下:
variableX.variable1 = 10
variableX.methodM()
但这里有一些细节,我们稍后再说…
3.2 使用对象
类和类的实例(类的对象)都是对象,因此两者都可以拥有自己的变量和方法。
存在两种类型的变量:
-
类的属性/变量/字段
(class property)
-
对象的属性/变量/字段
(object property)
而且有整整三种类型的方法:
-
类的方法/函数
(class method)
-
对象的方法/函数
(instance method)
-
静态方法
(static method)
这些方法的不同之处在于它们的声明方式和调用方式。
对象的方法
在声明对象的方法时,需要传递第一个必填参数 — self
。在调用方法时,
这个参数传递对象的引用 instance
。
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
在上面的示例中,当开始执行instance_method()
时,
参数self
被传递了对象my_object
的引用。
类的方法
在声明类的方法时,也需要传递第一个必填参数 — cls
。
在调用方法时,这个参数传递类的引用 (class object)
。
此外,需要用classmethod
装饰器标记类的方法,如下例所示:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
在上面的示例中,当开始执行class_method()
时,
参数cls
被传递了类MyClass
的引用。
静态方法
在声明静态方法时,不需要传递任何东西,但它也不能访问类的内部数据。
此外,需要用staticmethod
装饰器标记静态方法,如下例所示:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "这个方法不依赖于实例或类"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
静态方法的调用非常类似于类的方法,但没有对象引用或类引用传递给它。
3.3 类变量
类变量
为了声明一个类的变量(属性),只需在类的任意地方声明它即可。 通常在方法声明之前进行。示例:
class MyClass:
attribute = "我是类的属性"
@classmethod
def class_method(cls):
print(cls.attribute) # 我是类的属性
my_object = MyClass()
MyClass.class_method()
如果你想读取或写入类变量的值,请使用对象cls
。
通常,可以通过类名访问类变量:
class MyClass:
attribute = "我是类的属性"
@classmethod
def class_method(cls):
print(MyClass.attribute) # 我是类的属性
my_object = MyClass()
print(MyClass.attribute) # 我是类的属性
对象的变量/字段
对象的变量(instance)
是对象self
的字段。你只需通过self.name
访问它们。
这就是为什么对象self
被传递给每个对象方法的原因。
示例:
class MyClass:
attribute = "我是类的属性"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("对象字段名为name")
my_object.print_name() # "对象字段名为name"
每次调用对象的方法时,第一个参数(self)
传递的是你调用方法的对象的引用。
不同的对象方法可以通过使用对象self
访问共享数据。
GO TO FULL VERSION