
Python之对象和类
1. 什么是对象
2. 使用class定义类
如果把类比作塑料盒子,类则像是制作和自用的模具。例如,Python的内置类String可以创建像‘cat’和‘duck’这样的字符串对象。Python中还有许多用来创建其他标准数据类型的类,包括字典、列表等。如果想要在Python中创建属于自己的对象,首先必须用关键词class来定义一个类。
1 | #创建一个空类 |
重新定义类,将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!
没看完,后续补充