一、类的初级使用
1.类(Class)
用来描述具有相同属性和方法的对象集合。
类定义了每个对象所共有的属性和方(对象是类的实例)
2.实例化
创建一个类的实例,叫做类的实例化,结果是生成一个具体的对象
3.方法
类中定义的函数
4.对象
通过类定义的数据结构实例。包含类中定义的变量与方法
梳理以上4点: 类可以当做一个蓝图,而对象就是根据蓝图创造出来的具体存在体,蓝图在设计的时候规定了他有什么功能(也就是方法),而创建对象的过程称为实例化
5.定义类和生成对象
如下,通过class 加类名创建类,注意命名,类名的第一个字母最好为大写
通过类名()的形式创建对象,可以通过变量.对象名来调用类中的变量
>>> class Mode:
... a=10
...
>>> obj=Mode()
>>> print(obj.a)
10
6.构造器方法
当实例化对象时,构造器方法默认被执行。构造器方法一般用于初始化对象
实例本书作为第一个参数,传递给self,如下
>>> class BearToy:
... def __init__(self,size,color):
... self.size=size
... self.color=color
...
>>> tidy=BearToy('small','orange')
>>> print(tiry)
>>> print(tidy.size,tidy.color)
small orange
7.在类中定义方法
类中定义的方法需要绑定在具体的实例,由实例调用
实例方法需要明确调用
>>> class BearToy:
... def __init__(self,size,color):
... self.size=size
... self.color=color
... def speak(self):
... printf("hello!")
>>> tidy=BearToy('small','orange')
>>> print(tiry)
>>> print(tidy.size,tidy.color)
small orange
>>>tidy.speak()
hello!
二、类的高级使用
1.类的组合
类被定义后,目标是把它当做一个模块来使用,并把这些对象嵌入到你的代码中去
组合让不同的类混合,将A类加入到B类,增加B类的功能和代码重用性
可以在一个大点的类中创建其他类的实例,实现一些其他属性和方法来增强这个类的功能
2.组合实例
将一个类作为另一个类的组件
>>> class Manufacture:
... def __init__(self,phone,email):
... self.phone=phone
... self.email=email
...
>>> class BearToy:
... def __init__(self,size,color,phone,email):
... self.size=size
... self.color=color
... self.vendor=Manufacture(phone,email)
...
>>> m=Manufacture('121212','21@qq.com')
>>> b=BearToy('small','orange',m.phone,m.email)
>>> print(b.vendor.email)
21@qq.com
3.继承
当设计相同的类但有一些不同的功能时,我们将这些不同的类叫做派生类,但这些类有共同的父类,他们继承与父类
创建子类只需要在圆括号中写明从哪个父类继承即可
继承属性:
继承描述了基类的属性如何‘遗传’给派生类
子类可以继承它的基类的任何属性,不管是数据属性还是方法
>>> class BearToy:
... def __init__(self,size,color):
... self.size=size
... self.color=color
...
>>> class NewBearToy(BearToy):
... pass
...
>>> nb=NewBearToy('small','orange')
>>> print(nb.size,nb.color)
small orange
覆盖方法:
如果子类中有和父类同名的方法,父类方法将被覆盖,如果需要访问父类的方法,则需要调用一个未绑定的父类方法,明确给出子类的实例
>>> class A:
... def say(self):
... print("father")
...
>>> class B(A):
... def say(self):
... print("son")
...
>>> b=B()
>>> b.say()
son
多重继承:
python允许多重继承,即一个类可以是多个父类的子类,子类可以拥有所有父类的属性
>>> class A:
... def say(self):
... print('mon')
...
>>> class B:
... def say2(self):
... print('father')
...
>>> class C(A,B):
... pass
...
>>> c=C()
>>> c.say()
mon
>>> c.say2()
father
4.类的特殊方法
1)__init__
实例化类实例时默认调用的方法,用于接收参数
>>> class BearToy:
... def __init__(self,size,color):
... self.size=size
... self.color=color
>>> nb=NewBearToy('small','orange')
2)__str__
返回字符串,用于定义类的输出结果,常规输出:<class '__main__.类名'>,__str__可以自定义输出结果
>>> class BearToy():
... def __init__(self,size,color):
... self.size=size
... self.color=color
... def __str__(self):
... return '<Bear:%s%s>' % (self.size,self.color)
...
>>> bear=BearToy('small','orange')
>>> print(bear)
<Bear:smallorange>
3)__call__
通过类()调用类的输出
>>> class BearToy():
... def __init__(self,size,color):
... self.size=size
... self.color=color
... def __call__(self):
... print('I am a %s bear' % self.size)
...
>>> bear=BearToy('small','orange')
>>>bear()
'I am a orange bear
三、练习程序
1.编写游戏人物
要求:
- 创建游戏角色类
- 游戏人物角色拥有名字、武器等属性
- 游戏人物具有攻击和行走的方法
- 武器通过武器类实现
方案:
由于游戏角色和武器都由类实现,而这个两个类又完全不同,所以可以通过组合来实现。将武器类的一个实例作为游戏人物的一个属性。
#!/bin/usr/env python3
#encode=utf-8#定义武器类
class Weapon:
def __init__(self,name,strength):
self.name=name
self.strength=strength#定义人物类
class Warrior:
#将武器类的实例添加到人物类的构造函数中
def __init__(self,name,weapon):
self.name=name
self.weapon=weapondef speak(self,words):
print('I am %s,%s' % (self,name,words))def show_me(self):
print('我是%s,我是一个战士、我的武器是%s' % (self.name,self.weapon.name))if __name__=='__main__':
blade=Weapon('青龙偃月刀',100)
print(blade.name,blade.strength)
gy=Warrior('关羽',blade)
gy.show_me()
cz = Weapon('禅杖', 100)
lzs = Warrior('鲁智深', cz)
青龙偃月刀 100
我是关羽,我是一个战士、我的武器是青龙偃月刀
我是鲁智深,我是一个战士、我的武器是禅杖
2.出版商程序
要求:
- 为出版商编写一个Book类
- Book类有书名、作者、页数等属性
- 打印实例时,输出书名
- 调用实例时,显示该书由哪个作者编写
方案:
创建一个类,类中创建3种方法:
- 1.__init__方法:__init__方法用于初始化实例属性,创建对象后会自动调用__init__方法,属于构造器方法,此处初始化了书名及作者两个属性
- 2.__str__方法:创建对象后,打印实例对象pybook,返回书名,打印出书名
- 3.__call__方法:创建对象后,可以像调用函数一样调用该方法,模拟函数的行为,打印出书名及作者
#!/usr/bin/env python3
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __str__(self):
return '<Book: %s>' % self.title
def __call__(self):
print('《%s》 is written by %s.' % (self.title, self.author))
if __name__ == '__main__':
pybook = Book('Core Python', 'Weysley')
print(pybook) # 调用__str__
pybook() # 调用__call__
<Book: Core Python>
《Core Python》 is written by Weysley.