Python 是一种基于面向对象编程(OOP)原则的面向对象编程语言。这意味着程序中使用的实体都是某个类的对象。例如,数字、字符串、列表、字典和其他类似的程序实体都是相应内置类的对象。
在 Python 中,名为 Object 的类是所有类的基础或父类,包括内置类和用户定义的类。
Python 中的类是什么?
在 Python 中,类是一种用户定义的实体(数据类型),它定义了对象可以包含的数据类型以及它可以执行的动作。它作为创建对象的模板使用。例如,如果我们想在 Python 程序中定义一个智能手机的类,我们可以使用像 RAM、ROM、屏幕尺寸这样的数据类型和像打电话和发短信这样的动作。
在 Python 中创建类
在 Python 中使用 class
关键字来创建一个新的类。类名紧随 class
关键字之后,并以冒号结尾,如下所示:
class ClassName:
'Optional class documentation string'
class_suite
类包含一个文档字符串,可以通过 ClassName.__doc__
访问。
class_suite
包括定义类成员的所有组件语句、数据属性和函数。
示例
以下是一个简单的 Python 类的示例:
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
变量 empCount
是一个类变量,其值被此类的所有实例共享。这个值可以通过 Employee.empCount
从类的内部或外部访问。
第一个方法 __init__()
是一个特殊的方法,被称为构造函数或初始化方法,当您创建此类的一个新实例时 Python 会调用它。
您可以像声明普通函数一样声明其他类方法,只是每个方法的第一个参数是 self
。Python 会在调用方法时自动添加 self
参数;在调用方法时不需要包括它。
什么是对象?
对象是指特定 Python 类的一个实例。每个对象都有它自己的属性和方法,这些是由它的类定义的。
当创建一个类时,它仅仅描述了对象的结构。当从一个类实例化一个对象时,才会分配内存。
创建 Python 中的类的对象
为了创建类的实例,您需要使用类名并传递 __init__
方法接受的任何参数。
emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
在 Python 中访问对象的属性
您可以通过对象使用点操作符访问对象的属性。类变量可以通过类名访问如下:
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
现在,把所有的概念放在一起:
class Employee:
"Common base class for all employees"
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
当执行上述代码时,会产生如下结果:
Name : Zara , Salary: 2000
Name : Manni , Salary: 5000
Total Employee 2
您可以随时添加、移除或修改类和对象的属性:
emp1.age = 7
emp1.age = 8
del emp1.age
除了使用正常的语句来访问属性,您还可以使用以下函数:
-
getattr(obj, name[, default])
— 用于访问对象的属性。
-
hasattr(obj, name)
— 用于检查是否存在某个属性。
-
setattr(obj, name, value)
— 用于设置属性。如果属性不存在,则会创建它。
-
delattr(obj, name)
— 用于删除属性。
hasattr(emp1, 'age')
getattr(emp1, 'age')
setattr(emp1, 'age', 8)
delattr(emp1, 'age')
Python 中的内置类属性
每个 Python 类都保持以下内置属性,并且可以使用点操作符像任何其他属性一样访问它们:
序号 |
属性 |
描述 |
1 |
__dict__ |
包含类命名空间的字典。 |
2 |
__doc__ |
类文档字符串或未定义时为 None。 |
3 |
__name__ |
类名。 |
4 |
__module__ |
定义类的模块名。在交互模式下,此属性为 "main"。 |
5 |
__bases__ |
包含基类的元组,按照它们在基类列表中出现的顺序。 |
示例
对于上面的 Employee 类,让我们尝试访问它的属性:
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__)
当执行上述代码时,会产生如下结果:
Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount':
<function displayCount at 0xb7c84994>, 'empCount': 2,
'displayEmployee': <function displayEmployee at 0xb7c8441c>,
'__doc__': 'Common base class for all employees',
'__init__': <function __init__ at 0xb7c846bc>}
Python 数据类型的内置类
正如前面提到的,Python 遵循面向对象编程范式。实体如字符串、列表和数据类型都属于一个或另一个内置类。
如果我们想知道哪种数据类型属于哪个内置类,我们可以使用 Python 的 type()
函数。这个函数接受一个数据类型并返回其对应的类。
示例
下面的示例演示了如何检查给定数据类型的内置类。
num = 20
print (type(num))
num1 = 55.50
print (type(num1))
s = "TutorialsPoint"
print (type(s))
dct = {'a':1,'b':2,'c':3}
print (type(dct))
def SayHello():
print ("Hello World")
return
print (type(SayHello))
当您执行这段代码时,它会显示 Python 数据类型的对应类:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'dict'>
<class 'function'>
Python 中的垃圾回收(销毁对象)
Python 自动删除不需要的对象(内置类型或类实例),以释放内存空间。Python 周期性地回收不再使用的内存块的过程称为垃圾回收。
Python 的垃圾收集器在程序执行期间运行,并在对象的引用计数达到零时触发。当对象不再被引用时,Python 会自动收集它。
创建的对象 <40>
的引用计数会在对其赋值或放入容器(列表、元组或字典)时增加。当对象被 del
删除,其引用被重新赋值,或者其引用超出作用域时,对象的引用计数会减少。当对象的引用计数达到零时,Python 会自动收集它。
a = 40
b = a
c = [b]
del a
b = 100
c[0] = -1
通常情况下,当垃圾收集器销毁未使用的实例并重新获取其空间时,您不会注意到。但是,类可以实现特殊的 __del__()
方法,即析构函数,在实例即将被销毁时被调用。这个方法可能会用来清理实例使用的任何非内存资源。
示例
__del__()
析构函数在下面的代码块中演示了即将被销毁的实例的类名:
class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print (class_name, "destroyed")
pt1 = Point()
pt2 = pt1
pt3 = pt1
print (id(pt1), id(pt2), id(pt3))
del pt1
del pt2
del pt3
当执行上述代码时,会产生如下结果:
135007479444176 135007479444176 135007479444176
Point destroyed
Python 中的数据隐藏
一个对象的属性可能在类定义之外可见也可能不可见。你需要为属性命名加上双下划线前缀,这样这些属性就不会直接对外界可见。
示例
class JustCounter:
__secretCount = 0
def count(self):
self.__secretCount += 1
print(self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print(counter.__secretCount)
当执行上述代码时,会产生如下结果:
1
2
ERROR!
Traceback (most recent call last):
File <main.py>", line 11, in <module>
AttributeError: 'JustCounter' object has no attribute '__secretCount'
Python 通过内部更改名称以包含类名的方式来保护这些成员。你可以通过 object._className__attrName
的方式来访问这样的属性。如果你将最后一行替换为以下内容,那么它就可以正常工作:
print(counter._JustCounter__secretCount)
当执行上述代码时,会产生如下结果:
1
2
2