简单 Python 快乐之旅之:Python 基础语法之面向对象专题
文章目录
Python 是一门面向对象编程语言,Python 里一切皆对象。每个对象都有自己的属性和方法。
在 Python 里使用 class 关键字来定义类:
class ClassName:
# class body
类体部分可以包含对属性和方法的定义。
1. Python 里类的定义
在进行 Python 的类的定义之前,我们先来熟悉一下 Python 里常见的方法类型以及属性类型。
1.1. Python 常见的方法类型
Python 里常见的方法类型有三种:实例方法、静态方法和类方法。
1.1.1. 实例方法
实例方法就是类的实例使用的方法,其第一个参数必须是实例对象,该参数名一般约定为 self,通过它来传递实例的属性和方法,还能传递类的属性和方法。
实例方法只能由实例对象进行调用。
1.1.2. 静态方法
静态方法不需要实例或类对象作为参数,方法体中也不能使用类或实例的任何属性和方法,静态方法在定义时必须用装饰器 @staticmethod 注明。
实例对象和类对象都可以调用静态方法。
1.1.3. 类方法
类方法就是类对象使用的方法,其第一个参数必须是当前类对象,该参数名一般约定为 cls,通过它可以来传递类的属性和方法,但不能够传递实例的属性和方法。
1.2. Python 常见的属性类型
Python 里常见的属性类型有两种:实例属性和类属性 (又称静态变量)。
1.2.1. 实例属性
类实例化以后对实例定义的属性。注意,如果该属性已在类体重定义,即实例属性和类属性重名,那么实例属性将覆盖类属性。
1.2.2. 类属性
Python 中,在类体中定义的属性成为类属性,又称静态变量。Python 是动态语言,不存在完全静态的变量。
为了弄清楚实例属性和类属性的区别,我们看以下示例:
# Example – Define Class in Python
class Laptop:
name = 'My Laptop'
processor = 'Intel Core'
laptop = Laptop()
print('laptop.name:', laptop.name) # exactly class property: Laptop.name
laptop.weight = 2 # defined a new instance property weight
print('laptop.weight:', laptop.weight)
laptop.name = 'Whose Laptop' # defined a new instance property name, override class property Laptop.name
print('laptop.name:', laptop.name)
del laptop.name # instance property name destroyed
print('laptop.name:', laptop.name) # class property Laptop.name restored
执行和输出:
由此可见,laptop.name 首先指向的是该实例的实例属性,如果没有 name 这个实例属性,表示的是类属性。
所以在定义实例属性的时候千万别和类属性重名,否则会很容易弄混。
1.3. 类定义的示例
弄清楚上述概念以后,我们来进行一个类的定义:
# Example – Define Class in Python
class Laptop:
name = 'My Laptop'
processor = 'Intel Core'
@staticmethod
def start():
print('Laptop is starting...')
@staticmethod
def restart():
print('Laptop is restarting...')
@classmethod
def clsdetails(cls):
print('My Laptop name is:', cls.name)
def selfdetails(self):
print('My Laptop name is:', self.name)
print('It has', self.processor, 'processor.')
上述示例中,我们定义了两个类属性:name 和 processor;两个静态方法:start 和 restart;一个类方法:clsdetails;一个实例方法:selfdetails。
2. 实例对象的创建
pythonexamples 对此给出示例如下:
这是不被建议的。原因如上文所述。
我们重新给出示例:
# Example – Define Class in Python
class Laptop:
name = 'My Laptop'
processor = 'Intel Core'
@staticmethod
def start():
print('Laptop is starting...')
@staticmethod
def restart():
print('Laptop is restarting...')
@classmethod
def clsdetails(cls):
print('My Laptop name is:', cls.name)
def selfdetails(self):
print('My Laptop name is:', self.name)
print('It has', self.processor, 'processor.')
print(self.question)
print(self.answer)
# create object
laptop1 = Laptop()
laptop1.question = 'Any question?'
laptop1.answer = 'No question.'
laptop1.selfdetails()
执行和输出:
3. 访问类的属性和方法
从上面的例子中可以看出,可以使用点操作符来访问类的属性和方法。
object.property
object.method([arguments])
也可以使用赋值操作符,即等号,来给这些属性分配特定的值。
object.property = somevalue
variable1 = object.propery
4. __init__() 函数
在 Python 语言中,有一个内建函数 __init__(),每当对象被创建时它会就会被调用。__init__() 函数用于初始化对象的状态。也就是说,这是一个我们可以对我们的对象的创始或基本状态进行设定的地方。
我们还可以向 __init__() 函数传递一些参数,以便在创建每个对象时,可以将其创建为唯一的。
如果我们在定义类的时候没有定义 __init__() 函数,那么在创建对象时会有对内建 __init__() 函数的一个隐式调用。
在接下来的例子里,我们定义了一个具有 __init__() 函数的类,在该函数中我们将初始化对象的一些属性:
# __init__() Function Example
class Laptop:
def __init__(self, name, processor, hdd, ram, cost):
self.name = name
self.processor = processor
self.hdd = hdd
self.ram = ram
self.cost = cost
def details(self):
print('The details of the laptop are:')
print('Name :', self.name)
print('Processor :', self.processor)
print('HDD Capacity :', self.hdd)
print('RAM :', self.ram)
print('Cost($) :', self.cost)
# create object
laptop1 = Laptop('Dell Alienware', 'Intel Core i7', 512, 8, 2500.00)
print(laptop1.name)
laptop1.name = 'some'
print(laptop1.name)
del laptop1.name
print(laptop1.name)
# print(laptop1.processor)
# laptop1.details()
执行和输出:
可以看到使用 __init__() 函数我们做了很多事情。对此我们总结如下:
- __init__() 函数使用传递给它的参数初始化对象属性。
- 对象属性的声明在 __init__() 函数中就完成了。
- 这些定义的属性可以在该类的其他方法中访问 (self.name),也可以通过对象引用访问 (laptop1.name)。