Python | 对象和类

Python之对象和类

1. 什么是对象


2. 使用class定义类

如果把类比作塑料盒子,类则像是制作和自用的模具。例如,Python的内置类String可以创建像‘cat’和‘duck’这样的字符串对象。Python中还有许多用来创建其他标准数据类型的类,包括字典、列表等。如果想要在Python中创建属于自己的对象,首先必须用关键词class来定义一个类。

1
2
3
4
5
6
7
#创建一个空类
class Person():
pass

# 通过类名创建对象,同调用函数一样:
someone = Person()
(以上例子中,Person()创建了一个Person类的对象,并给它赋值someone这个名字。但是由于Person类是空的,所以由它创建的对象someone实际上什么也做不了。)

重新定义类,将Python中特殊的对象初始化方法init放入其中:

1
2
3
4
5
6
7
8
class Person():
def __init__(self,name):
#实际的Python类的定义形式。 __init__()是Python中一个特殊的函数名,用于根据类的定义创建实例对象。self参数指向了这个正在被创建的对象本身。当你在类声明里定义__init__()方法时,第一个参数必须为self。尽管self并不是一个Python保留字,但它很常用。
# 在初始化方法中添加name参数
self.name = name

#用Person类创建一个对象,为name特性传递一个字符串参数。
hunter = Person("Elmer Fudd")

print("The mighty hunter:", hunter.name)  
The mighty hunter: Elmer Fudd  

3. 继承

1
2
3
4
5
6
7
8
9
10
class Car():
pass

class Yugo(Car):
pass


#接着,为每个类创建一个实例对象:
give_me_a_car = Car()
give_me_a_yugo = Yugo()

1
2
3
4
5
6
class Car():
def exclaim(self):
print("I'm a Car!")

class Yugo(Car):
pass
# 最后,为每个类创建一个对象,并调用刚刚声明的exclaim方法: >>> give_me_a_car = Car() >>> give_me_a_yugo = Yugo() >>> give_me_a_car.exclaim() I'm a Car! >>> give_me_a_yugo.exclaim() I'm a Car!

我们不需要做任何特殊的操作,Yugo就自动从Car那里继承了exclaim()方法。但事实上,我们并不希望Yugo在exclaim()方法里宣称它是一个Car,这可能会造成身份危机(无法区分Car和Yugo)。让我们来看看怎么解决这个问题。

4. 覆盖方法

新创建的子类会自动继承父类的所有信息。那子类是如何替代–或者说覆盖(override)–父类的方法。Yugo和Car一定存在着某些区别,不然的话,创建它又有什么意义?

尝试改写以下Yugo中的exclaim()方法的功能:

1
2
3
4
5
6
7
8
9
10
11
12
class Car():
def exclaim(self):
print("I'm a Car!")

class Yugo(Car):
def exclaim(self):
print("I'm a Yugo! Much like a Car , but more Yugo-ish.")


#接着,为每个类创建一个实例对象:
give_me_a_car = Car()
give_me_a_yugo = Yugo()

看看它们各自会宣称什么?

>>> give_me_a_car.exclaim()
I'm a Car!
>>> give_me_a_yugo.exclaim()
I'm a Yugo! Much like a Car , but more Yugo-ish.  

在上面的例子中,覆盖了父类的exclaim()方法,在子类中,可以覆盖任何父类的方法,包括init()。下面的例子使用了之前创建过的Person类。我们来创建两个子类,分别代表医生(MDPerson)和律师(JDPerson):

class Person():
    def __init__(self,name): 
        self.name = name

class MDPerson(Person):
    def __init__(self,name): 
        self.name = "Doctor" + name

class JDPerson(Person):
    def __init__(self,name): 
        self.name = name + "Esquire"

在上面的例子中,子类的初始化方法init()接收的参数和父类Person一样,但存储到对象内部name特性的值却不尽相同:

>>> person = Person("Fudd")  
>>> doctor = MDPerson("Fudd")  
>>> lawyer = JDPerson("Fudd") 
>>> print(person.name)
Fudd
>>> print(doctor.name)
Doctor Fudd
>>> print(lawyer.name)
Fudd Esquire  

5. 添加新方法

6. 使用super从父类得到帮助

调用父类的方法—-> super()

下面这个例子将定义一个新的类EmailPerson,用于表示有电子邮箱的Person。首先,来定义熟悉的Person类:

class Person():
    def __init__(self,name): 
        self.name = name  

下面是子类的定义,注意,子类的初始化方法init()中添加了一个额外的email参数:

class EmailPerson(Person):
    def __init__(self,name, email):
        super().__init__(name) 
        self.email = email  

7. self的自辩

Python中必须把self设置为实例方法(前面例子中你见到的所有方法都是实例方法)的第一个参数。 Python使用self参数来找到正确的对象所包含的特性和方法。通过下面的例子,来查看调用对象方法背后Python实际做的工作。

前面例子中所讲的Car类,再次调用exclaim()方法:

>>> car = Car()
>>> car.exclaim()
I'm a Car!  

没看完,后续补充

8.

9.

10.

11.

12.

13.

-------------本文结束感谢您的阅读-------------
0%