####python的面向对象###
1.面向对象的三个特征:封装,继承,多态
2.多态:不同的子类对象调用相同的方法,产生不同的执行结果
示例:
class Dog(object):
def __init__(self,name):
self.name = name
def game(self):
print '%s蹦蹦跳跳的玩'%self.name
class xiaotiandog(Dog):
def game(self):
print '%s飞到天上玩'%self.name
class Person(object):
def __init__(self,name):
self.name = name
def game_with_dog(self,dog):
print '%s和%s快乐的玩耍'%(self.name,dog.name)
dog.game() ##调用相同的方法,产生的结果不同
#wangcai = Dog('旺财')
wangcai = xiaotiandog('旺财') ##这两个不同的对象
xm = Person('小明')
xm.game_with_dog(wangcai)
"""
案例小结:
Person类中只需要让狗调用game方法(这就是子类的父类中封装的方法),而不关心具体是什么狗
game方法是在Dog父类中定义的
在程序执行时,传入不同的狗对象的实参,就会产生不同的执行效果
"""
3.面向对象三大特征:
(1).封装:根据职责将属性和方法封装到一个抽象的类中
(2).继承:实现了代码的复用,相同的代码不需要重复的编写
(3).多态:(以继承和封装为前提),不同的子类对象调用相同的方法,产生不同的执行结果
示例:
人类:
work方法:
程序员 设计师
不同的对象,调用相同的方法,会产生不同的结果
"""
4.类属性:类属性就是针对类对象定义的,通过赋值语句在class关键字下可以定义类属性,类属性用于记录与这个类相关的特征。
在python中,一切皆对象
类是一个特殊的对象————类对象
在程序运行的时候,类对象(创建实例对象的模板)
在内存中只有一份,通过它可以创建出很多个对象实例
除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
(1)类属性
(2)类方法
通过 类名. 的方式可以直接访问类的属性
类属性:就是给类对象定义的属性
通常用来记录与这个类相关的特征
类属性不会用来记录具体的对象特征
示例:
class Toy(object):
#通过赋值语句定义类属性,记录所有玩具的数量
count = 0
def __init__(self,name):
self.name = name
#让类属性加1 类属性的调用方法 类名.类属性或者类方法
Toy.count += 1
#创建工具对象
tool1 = Toy('斧头')
tool2 = Toy('榔头')
print Toy.count ##类属性的调用方法 类名.类属性或者类方法
5.类方法:类方法就是针对类对象定义的方法,在类方法内部就可以直接访问类属性或者调用其他类方法。
示例:
class Toy(object):
#使用赋值语句定义类属性,记录所有玩具的数量
count = 0
@classmethod ##这个就是类方法
def show_toy_count(cls):
#cls.count 就是在类方法内部,访问当前的类属性
print '玩具对象的数量:%d'%cls.count
def __init__(self,name):
self.name = name
Toy.count += 1
tool1 = Toy('乐高')
tool2 = Toy('玩具熊')
Toy.show_toy_count()
6.静态方法:
在开发的时候,如果需要在类中封装一个方法,这个方法
既不需要访问实例属性或者调用实例方法,
也不需要访问类属性或者调用类方法
这个时候,我们就可以把这个方法封装成一个静态方法
示例:
class Cat(object):
#不访问实例属性/类属性
@staticmethod
def call():
print '喵喵~'
#通过 类名. 调用静态方法
#不需要创建对象,就可以直接使用
Cat.call()
7.类的结构
术语--实例
1.使用面向对象开发,第一步就是设计类
2.使用 类名() 创建对象,创建对象的动作有两步
1.在内存中为对象分配空间
2.调用初始化方法__init__为对象初始化
3.对象创建后,内存中就有了一个对象的实实在在的存在--实例
因此:
1.创建出来的对象叫做类的实例
2.创建对象的动作叫做实例化
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例方法
在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
访问自己的属性
调用自己的方法
8.练习
(1).设计一个Game类
(2).属性
定义一个属性top_score记录游戏的历史最高分(类属性)
定义一个属性player_name记录当前游戏玩家的姓名(实例属性)
(3).方法:
show_help显示游戏的帮助信息(静态方法)
show_top_score显示历史最高分(类方法,访问类属性)
start_game开始当前玩家的游戏(实例方法)
代码:
class Game(object):
top_score = 0
@classmethod
def show_top_score(cls):
print '历史最高分数是:%d'%cls.top_score
#实例属性在初始化方法内部定义
def __init__(self,player_name):
self.name = player_name
def start_game(self):
print '%s开始游戏'%self.name
@staticmethod
def show_help():
print '帮助信息'
#查看帮助信息
Game.show_help()
#查看历史最高分数
Game.show_top_score()
#创建游戏对象,开始游戏
xm = Game('小明')
xm.start_game()
"""
案例小结:
1.实例方法--方法内部需要访问实例属性
实例方法内部可以使用 类名.访问类属性
2.类方法:方法内部‘只’需要访问类属性
3.静态方法:方法内部,不需要访问实例属性和类属性
提问:
如果方法内部 即需要访问实例属性,又需要访问类属性,应该定义什么方法?
答案:
应该定义实例方法
因为,类只有一个,在实例方法内部可以使用类名,访问类属性
"""