Python 简明教程
Python - Classes and Objects
Python 是一种 object-oriented programming language ,这意味着它基于 OOP 概念的原则。在 Python 程序中使用的实体是某个类的一个对象。例如,数字、字符串、列表、字典以及程序的其他类似实体是相应内置类的对象。
在 Python 中,名为 Object 的类是所有类的基础类或父类,既包括内置类也包括用户自定义类。
What is a Class in Python?
在 Python 中,类是一种用户定义的实体(数据类型),它定义了对象可以包含的数据类型和它可以执行的操作。它用作创建对象的模板。例如,如果我们想要在 Python 程序中为智能手机定义一个类,我们可以使用数据类型(如 RAM、ROM、屏幕大小)和操作(如呼叫和消息)。
Creating Classes in Python
class 关键字用于在 Python 中创建新类。类的名称紧跟关键字 class,后跟一个冒号,如下所示 −
class ClassName:
'Optional class documentation string'
class_suite
-
类具有文档字符串,可以通过 ClassName. doc 访问该文档字符串。
-
class_suite 由定义类成员、数据属性和函数的所有组成语句组成。
Example
以下是简单 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 参数添加到列表中,当你调用方法时,你无需包含它。
What is an Object?
对象被称为给定 Python 类的实例。每个对象都有自己的属性和方法,这些属性和方法由其类定义。
当创建一个类时,它只描述了对象的结构。当从类实例化对象时分配内存。
在上图中,Vehicle 是类名,Car、Bus 和 SUV 是它的对象。
Creating Objects of Classes in Python
可以使用类名和传入其 ` init ` 方法接受的任何参数来创建类的实例。
# This would create first object of Employee class
emp1 = Employee("Zara", 2000)
# This would create second object of Employee class
emp2 = Employee("Manni", 5000)
Accessing Attributes of Objects in Python
可以使用带有 object
的点运算符访问该对象的属性。类变量可以使用类名进行访问,方法如下:
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)
# This would create first object of Employee class
emp1 = Employee("Zara", 2000)
# This would create second object of Employee class
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
可以随时添加、移除或修改类的属性和对象:
# Add an 'age' attribute
emp1.age = 7
# Modify 'age' attribute
emp1.age = 8
# Delete 'age' attribute
del emp1.age
除了使用常规语句来访问属性,还可以使用以下函数:
-
` getattr(obj, name[, default]) ` - 访问对象的属性。
-
` hasattr(obj,name) ` - 检查属性是否存在。
-
` setattr(obj,name,value) ` - 设置属性。如果属性不存在,则创建该属性。
-
` delattr(obj, name) ` - 删除属性。
# Returns true if 'age' attribute exists
hasattr(emp1, 'age')
# Returns value of 'age' attribute
getattr(emp1, 'age')
# Set attribute 'age' at 8
setattr(emp1, 'age', 8)
# Delete attribute 'age'
delattr(empl, 'age')
Built-In Class Attributes in Python
Python 类遵循下列内置属性,可以使用点运算符访问这些属性,就像访问任何其他属性一样:
SNo. |
Attributes & Description |
1 |
* dict *包含类名称空间的字典。 |
2 |
* doc *类文档字符串或无(如果未定义)。 |
3 |
*name*Class name |
4 |
* module *定义类的模块名称。此属性在交互模式下是“ main ”。 |
5 |
* bases *一个可能为空的元组,其中包含基类(按其在基类列表中出现的顺序)。 |
Example
对于上述 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>}
Built-in Class of Python datatypes
如前所述,Python 遵循面向对象编程范式。字符串、列表和数据类型等实体属于一个或另一个内置类。
如果我们想要查看哪种数据类型属于哪个内置类,可以使用 Python 的 type()
函数。此函数接受数据类型并返回其对应的类。
Example
以下示例演示如何检查给定数据类型的内置类。
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'>
Garbage Collection(Destroying Objects) in Python
Python 自动删除不需要的对象(内置类型或类实例)以释放内存空间。Python 定期回收不再使用内存块的过程称为垃圾收集。
Python 的垃圾回收器在程序执行期间运行,并在对象的引用计数达到零时触发。对象的引用计数会随着指向它的别名的数量而改变。
当对象被分配新名称或放置在容器(列表、元组或字典)中时,该对象的引用计数会增加。当对象被 del 删除、其引用被重新分配或其引用超出范围时,对象的引用计数会减少。当对象的引用计数为零时,Python 会自动收集它。
# Create object 40
a = 40
# Increase ref. count of 40
b = a
# Increase ref. count of 40
c = [b]
# Decrease ref. count of 40
del a
# Decrease ref. count of 40
b = 100
# Decrease ref. count of 40
c[0] = -1
当垃圾回收器销毁未使用的实例并回收其空间时,您通常不会注意到。但是,一个类可以实现一个特殊方法 del (),称为析构函数,该析构函数在即将销毁该实例时被调用。此方法可用于清理实例使用的任何非内存资源。
Example
当 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
# prints the ids of the obejcts
print (id(pt1), id(pt2), id(pt3))
del pt1
del pt2
del pt3
执行时,上述代码将产生以下结果 −
135007479444176 135007479444176 135007479444176
Point destroyed
Data Hiding in Python
对象的属性在类定义的外部可能可见,也可能不可见。你需要以双下划线前缀为属性命名,那么这些属性就不能直接被外部人员看到。
Example
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