简单 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

执行和输出:
弄清楚实例属性和类属性的区别.png
由此可见,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.')

上述示例中,我们定义了两个类属性:nameprocessor;两个静态方法:startrestart;一个类方法:clsdetails;一个实例方法:selfdetails

2. 实例对象的创建

pythonexamples 对此给出示例如下:
pythonexamples不被建议的示例.png
这是不被建议的。原因如上文所述。
我们重新给出示例:

# 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()

执行和输出:
实例对象的创建.jpg

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__() 函数.png
可以看到使用 __init__() 函数我们做了很多事情。对此我们总结如下:

  • __init__() 函数使用传递给它的参数初始化对象属性。
  • 对象属性的声明在 __init__() 函数中就完成了。
  • 这些定义的属性可以在该类的其他方法中访问 (self.name),也可以通过对象引用访问 (laptop1.name)。

参考资料

posted @ 2019-04-24 20:56  Defonds  阅读(20)  评论(0编辑  收藏  举报