Python编程中的类概念详解
Python–类
一、类的定义方法
在Python中,类可以通过关键字class
来定义。类的定义包含在一个代码块中,并且通常以冒号:
结尾。类的定义方法有以下几种:
1. 空类定义:
class MyClass:
pass
这是一个最简单的类定义,类体中没有任何内容。
2. 带有属性和方法的类定义:
class MyClass:
def __init__(self, name):
self.name = name # 属性
# 方法
def say_hello(self):
print(f"Hello, my name is {self.name}.")
这个类定义了一个带有一个属性name
和一个方法say_hello
的类。__init__
方法是一个特殊的方法,用于初始化对象的属性。
3. 继承父类:
class MyChildClass(MyParentClass):
def __init__(self):
super().__init__()
二、创建类的实例
所谓实例,是指类类型的变量。
- 如果类中定义了
__init__
方法,那么每当创建该类的实例时,__init__
方法都会被自动调用。__init__
方法通常用于初始化实例的属性。
class MyClass:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
instance = MyClass(1, 2) # 创建类的实例,自动调用__init__方法
print(instance.arg1) # 输出: 1
print(instance.arg2) # 输出: 2
- 如果类中没有定义
__init__
方法,那么创建类时会自动创建__init__
方法,并在创建实例时自动调用。
class MyClass:
pass
instance = MyClass() # 创建类的实例时自动创建并调用__init__方法
上述两种方式都可以创建类的实例,但是通过__init__
方法进行初始化更为常用和推荐,因为它能够自动在创建实例时完成初始化操作,避免了手动设置属性的繁琐和可能出现遗漏的情况。
三、创建类的成员
类的成员由实例方法和数据成员组成。
实例方法通常称为方法,数据成员称为属性。
所谓方法(或者实例方法)是指在类中定义的函数,数据成员(或者叫属性)是指在类中定义的变量。
例如:
class Student:
def __init__(self, name, age, score):
# self.name,self.age,self.score是数据成员(或者叫属性)
self.name = name
self.age = age
self.score = score
# introduce函数是Student的方法
def introduce(self):
print(f"姓名:{self.name}")
print(f"年龄:{self.age}")
print(f"成绩:{self.score}")
# 创建一个学生实例
student = Student("张三", 18, 90)
# 调用实例方法,介绍学生信息
student.introduce()
1、创建属性
属性分为类属性和实例属性。
创建类属性
类属性是同一个类的所有实例共享的属性。它们可以在类的定义中直接创建,并且对于同一个类的所有类的实例来说,它们的值是相同的。
例如:
class MyClass:
class_attribute = 1
instance1 = MyClass() # 创建实例1
instance2 = MyClass() # 创建实例2
print(instance1.class_attribute) # 输出: 1
print(instance2.class_attribute) # 输出: 1
通过上例可以看到,MyClass
类的两个不同实例instance1
和instance2
共同享有类属性class_attribute
。
注意:类属性可以通过类名.属性名
或者实例名.属性名
的方法访问。
例如:
class MyClass:
class_attribute = 1
instance = MyClass() # 创建实例
print(MyClass.class_attribute) # 通过类名访问。输出: 1
print(instance.class_attribute) # 通过实例名访问。输出: 1
创建实例属性
实例属性是每个类实例特有的属性。它们可以在类的初始化方法(__init__
)中使用 self
关键字创建,并且每个实例的实例属性的值可以是不同的。
class MyClass:
def __init__(self):
self.instance_attribute = 2
my_object = MyClass()
print(my_object.instance_attribute) # 输出: 2
实例属性也可以在类的其他方法中创建和使用。
class MyClass:
def __init__(self):
self.instance_attribute = 2
def print_attribute(self):
print(self.instance_attribute)
my_object = MyClass()
my_object.print_attribute() # 输出: 2
注意,实例属性对每个实例都是唯一的,每个实例都有自己的实例属性副本。而类属性是类的属性,所有的实例共享同一个类属性。实例属性只能通过实例.属性名
访问。
2、创建方法
Python类的方法是在类内部定义的函数。它们用于定义类的行为和操作。类的方法可以访问和操作类的属性,也可以调用其他方法。
实例方法
实例方法是类中定义的普通方法。它们的第一个参数通常被命名为self
,表示对当前实例对象的引用。通过这个参数,实例方法可以访问和操作当前对象的属性。
class MyClass:
def __init__(self, x):
self.x = x
def my_method(self):
print(self.x)
my_instance = MyClass(10)
my_instance.my_method() # 输出:10
类方法
类方法是在类级别定义的方法,使用@classmethod
装饰器进行标识。类方法的第一个参数通常被命名为cls
,表示对当前类的引用。类方法可以访问和修改类的属性,也可以调用其他类方法。
class MyClass:
x = 0
@classmethod
def my_class_method(cls):
cls.x += 1
print(cls.x)
MyClass.my_class_method() # 输出:1
MyClass.my_class_method() # 输出:2
这是类方法的一个例子,其中类属性x
被逐次递增。
四、类成员的访问权限
在Python中,可以使用下划线来表示成员的访问权限。有两种下划线的使用方式,分别是单下划线(保护权限:protected)和双下划线(私有权限:private)。
1、保护属性成员
- 单下划线(_):表示成员是受保护的,约定成员应该被视为非公开的,不应该直接访问。但实际上,Python并不会强制限制对受保护成员的访问,只是通过命名约定来提醒开发者不要直接访问这些成员。
例如:
class MyClass:
_protected_member = 10 # 保护属性成员
def print_protected_member(self):
print(self._protected_member)
my_object = MyClass()
my_object.print_protected_member() # 通过实例方法访问保护类型成员。输出:10
print(my_object._protected_member) # 通过实例访问保护类型成员。输出:10(不推荐直接访问)
print(MyClass._protected_member) # 通过类名访问保护类型成员。输出:10
# 输出:
10
10
10
保护类型的成员,允许类本身
、子类
和实例
直接访问,但不能使用from module import *
导入。
2、私有属性成员
双下划线(__):表示成员是私有的,只能在类的内部访问,无法从外部直接访问。这样的成员可以防止子类中的命名冲突。
例如:
class MyClass:
__protected_member = 10 # 私有属性成员
def __init__(self):
print(MyClass.__protected_member) # 实例方法中访问私有属性成员
my_object = MyClass()
print(my_object._MyClass__protected_member) # 通过“实例名._类名__成员名”访问私有属性。
# 输出:
10
10
需要注意的是,Python中的私有成员实际上是经过了名称重整(name mangling)的,在名称前会加上一个下划线和类名,所以无法直接访问。如果想在外部访问私有成员,可以通过实例名._类名__成员名
的方式访问,但这种方式不推荐使用。
五、装饰器
用法1:
在Python中,可以通过@property(装饰器)将一个方法
转为属性
,从而可以实现直接使用方法名来访问方法,而不需要再添加一对小括号,这样可以使得代码更加简洁。
例如:
class Rect():
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rect(800, 600)
print("面积为:", rect.area)
# 输出
面积为: 480000
用法2:
在Python中,默认情况下,创建的类属性或者实例是可以在类体外修改的,如果要想限制其不能在类体外修改,可以将其设置为私有的,但设置为私有的之后又不能在类体外访问。如果要创建一个可以读取,但不能修改的属性,可以使用@property实现只读属性。
例如:
class MyClass():
def __init__(self):
self.__private_attribute = 10 # 私有属性
@property # 将方法转为属性
def print_attribute(self): # 定义方法
return self.__private_attribute # 返回私有属性的值
instance = MyClass() # 创建实例
print(instance.print_attribute) # 获取私有属性的值
作者:墨上烟雨