Python 类
1 类的创建和类的实例
Python 是一种面向对象的编程语言,其中类是非常重要的概念。
类是一种用户定义的数据类型,它代表着一类具有相同属性和方法的对象的集合。
实例则是类的具体实现,是类的一个个体,可以使用类定义的属性和方法。
- 定义类:使用关键字
class
- 创建一个类的对象:可以通过类名后面加括号来创建一个实例
__init__()
作为类的构造方法,用来初始化类的实例,self
表示类的实例本身。self
的名字并不是规定死的,也可以使用this
,但是最好还是按照约定使用self
。
- 其他方法则按照正常函数的形式定义。
- 类可以定义属性和方法,属性是类的数据成员,方法是类的函数成员。
- 类的方法与普通的函数只有一个特别的区别:它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
class Dog:
def __init__(self, name, breed, age):
self.name = name
self.breed = breed
self.age = age
my_dog = Dog('Buddy', 'Golden Retriever', 6)
上面的代码中,“Dog
”类表示狗类,它包含名字、品种和年龄这三个属性。
创建了一个 “my_dog
” 的实例,该实例有名为 “Buddy
” 的名字、品种为 “Golden Retriever
”、年龄为 6
岁。
此时,my_dog
变量就代表了一个狗类的实例,可以通过访问它的属性来获取相应的信息,例如:
print(my_dog.age)
这将打印出 6
。同时,也可以使用对象的方法来修改属性或进行其他操作:
class Dog:
def __init__(self, name, breed, age):
self.name = name
self.breed = breed
self.age = age
def bark(self):
print('Woof woof!')
my_dog = Dog('Buddy', 'Golden Retriever', 6)
my_dog.bark() # 输出 “Woof woof!”
2 类的属性
在 Python 中,类的属性可以被理解为类的变量。
Python 的公有属性、私有属性以及实例属性、静态属性之间是存在关联的,具体关系如下:
-
公有属性:指没有加前缀双下划线
__
的属性,可以在类内外被访问,也可以被继承和重写。 -
私有属性:指加了前缀双下划线
__
的属性,只能在类内被访问和修改,而在类外部无法访问或修改。 -
实例属性:指定义在
__init__
方法中,以self.属性名
的形式定义的属性,每个实例都独立拥有一个自己的实例属性,它们随实例创建和销毁。 -
静态属性:指在类下直接定义的属性,可以使用类名直接访问,它们是类的属性,每个实例都共享一个静态属性。
公有属性和私有属性是属于对象或类中的实例属性或静态属性的一种访问方式,
也就是说,公有属性和私有属性可以同时作为实例属性和静态属性存在。
对于 Python 中的公有属性和实例属性的关系,可以通过实例的 self.属性名
来访问和修改;
而对于 Python 中的私有属性,则需要在属性名前面加上双下划线"__
",才能被认定为私有属性,无法通过实例调用,只能通过类内部的方法进行访问和修改。对于静态属性,则是直接定义在类下,可以使用类名进行访问和修改。
2.1 实例属性和类属性
类的属性有两种类型:实例属性和类属性。
类型 | 定义 | 特点 |
---|---|---|
实例属性 | 类的实例的属性 | 各个实例相互之间不产生影响 |
静态属性/类属性 | 类本身的属性 | 类的所有实例都共享一份类属性,各个实例相互之间会产生影响 |
属性 | 实例属性 | 静态属性 |
---|---|---|
定义方式和作用 | 定义在实例方法中,仅对当前实例有效 | 定义在类中,对所有实例共享同一份 |
访问方式 | 通过实例进行访问 | 通过类名进行访问 |
访问时用的是哪个对象属性 | 实例属性值 | 只有一个静态属性值,共用同一个 |
生命周期 | 随着实例的创建和销毁而创建和销毁 | 随着类的创建和销毁而创建和销毁 |
作用域 | 实例内部作用域内 | 类的内部作用域内 |
示例 | self.name = '张三' (在 init 中) |
name = '李四' (在类中) |
2.1.1 实例属性
实例属性是指属于某个对象的属性,每个对象都有自己独立的实例属性,相互之间不会产生影响。
实例属性的赋值一般在类的初始化方法 __init__
中进行,也可以在对象创建之后通过赋值来添加实例属性。
例如,我们定义一个人类 Person
,可以在初始化方法中定义实例属性 name
和 age
,如下所示:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
2.1.2 静态属性/类属性
- 类属性是指属于整个类的属性,所有对象共享一份类属性,相互之间会产生影响。
- 类属性一般在类的定义中直接定义,也可以在类的其他方法中添加。
- 类的属性是反映类内部状态的变量,可以在类的定义中定义和修改,也可以在类的其他方法中访问和使用。
- 理解好类的属性对于深入理解 Python 面向对象编程非常重要。
例如,我们为人类 Person
添加一个类属性 species
,表示人类的种类,定义如下:
class Person:
species = 'human' # 定义类属性
def __init__(self, name, age):
self.name = name
self.age = age
def get_species(self): # 定义实例方法
return self.species
- 在类属性的访问和修改上,可以通过类名或对象名来访问。
例如,我们可以通过 Person.species
来访问类属性,也可以通过 person1.species
来访问对象 person1
的类属性。
- 类属性的修改同样可以通过类名或对象名来实现。
如果通过对象名修改类属性,则会创建一个同名的实例属性,该实例属性会覆盖掉类属性的值,不会改变类属性的值。
例如,我们修改 person1.species
的值为 'homo erectus'
,则会创建一个实例属性 species
,它的值为 'homo erectus'
,但是不会改变类属性 Person.species
的值。
2.2 公有属性和私有属性
在 Python 中,类的属性(或者成员变量)也可以分为公有属性和私有属性。
属性类型 | 声明方式 | 外部访问方式 | 内部访问方式 |
---|---|---|---|
公有属性 | 未加任何修饰符 | 直接访问 | 直接访问 |
私有属性 | 在属性名前面加双下划线 __ |
不能直接访问,可以通过访问方法间接访问 | 可以直接访问 |
2.2.1 公有属性
公有属性是指可以从类的外部直接访问和修改的属性,一般在类的构造方法中用 self
关键字来定义,例如:
class Student:
def __init__(self, name, age):
self.name = name # 公有属性
self.age = age # 公有属性
在这个例子中,name
和 age
都是公有属性,我们可以通过实例对象直接访问和修改它们的值:
s = Student('Lucy', 20)
print(s.name) # 'Lucy'
s.age = 21
print(s.age) # 21
2.2.2 私有属性
私有属性是指不能从类的外部直接访问和修改的属性。在 Python 中,可以通过在属性名前面加上双下划线 __
来定义私有属性,例如:
class Student:
def __init__(self, name, age):
self.__name = name # 私有属性
self.__age = age # 私有属性
在这个例子中,__name
和 __age
都是私有属性,我们无法直接访问和修改它们的值:
s = Student('Lucy', 20)
print(s.__name) # AttributeError: 'Student' object has no attribute '__name'
s.__age = 21 # AttributeError: 'Student' object has no attribute '__age'
这是因为 Python 解释器会自动将属性名 __name
和 __age
替换成 _Student__name
和 _Student__age
,从而防止属性被意外访问和修改。
虽然无法直接访问和修改私有属性,但是我们可以通过类内部定义的方法来访问和修改它们的值,例如:
class Student:
def __init__(self, name, age):
self.__name = name # 私有属性
self.__age = age # 私有属性