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
  1. 类具有文档字符串,可以通过 ClassName. doc 访问该文档字符串。

  2. 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
  1. 可变 empCount 是一个类变量,它的值在这个类的所有实例之间共享。它可以在类的内部或外部作为 Employee.empCount 进行访问。

  2. 第一个方法 init () 是一个特殊方法,它称为类构造函数或初始化方法,当你创建一个新的这个类的实例时,Python 会调用它。

  3. 除了第一个参数为每个方法的 self 外,你可以像使用普通函数那样声明其他类方法。Python 将 self 参数添加到列表中,当你调用方法时,你无需包含它。

What is an Object?

对象被称为给定 Python 类的实例。每个对象都有自己的属性和方法,这些属性和方法由其类定义。

当创建一个类时,它只描述了对象的结构。当从类实例化对象时分配内存。

class object

在上图中,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

除了使用常规语句来访问属性,还可以使用以下函数:

  1. ` getattr(obj, name[, default]) ` - 访问对象的属性。

  2. ` hasattr(obj,name) ` - 检查属性是否存在。

  3. ` setattr(obj,name,value) ` - 设置属性。如果属性不存在,则创建该属性。

  4. ` 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