一.私有属性和私有方法
1.私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法。在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线)
class Woman():
def __init__(self, name, age):
self.name = name
self.__age = age #定义一个私有数据__age
def __secret(self): # 定义一个私有方法__secret
print '%s的年龄是%s' % (self.name, self.__age)
lily = Woman('lily', 18)
# print lily.age # 不能访问该私有方法
lily.secret()
2.继承中私有属性和私有方法问题:子类不能继承父类的私有属性,不能调用父类的私有方法。
class A(object):
def __init__(self):
# 定义一个私有属性一个共有属性
self.num1 = 100
self.__num2 = 200
# 定义私有方法
def __test(self):
print '私有方法 %d %d' %(self.num1,self.__num2)
class B(A):
pass
# def demo(self):
#print '访问父类的私有属性:%d' % self.__num2
# 在外界不能直接访问对象的私有属性/调用私有方法
b = B()
# b.demo()
print b.__num2
b.__test
二.Python面向对象中的旧式类和新式类
新式类:在定义类时,类后边括号中要继承自object类(基类)
旧式类(经典类):在定义类时,类后边括号中不用继承object类,甚至不用括号
dir方法是查看类所能使用的方法
三.类对象和类方法
1.类对象:类是一个特殊的对象,称为类对象。在运行程序时,类也会被加载在内存中
类除了继承封装多态的属性和方法外,还可以有自己的属性和方法,通过(类名.)的方法可以直接访问其属性和方法
class Tool(object):
# 定义一个类属性count
count = 0
def __init__(self,name):
self.name = name
# 在对象的方法中不能调用类的属性,所以加上类名
Tool.count += 1
tool1 = Tool('锤子')
tool2 = Tool('斧头')
tool3 = Tool('剪刀')
print Tool.count
2.类方法 类方法就是针对类对象定义的方法,在类内部可以直接调用类方法
定义格式:
@classmethod def 类方法名(cls)
pass
class Toy(object):
# 定义类属性
count = 0
def __init__(self,name):
self.name = name
Toy.count += 1
# 定义类方法
@classmethod
def show_toy_count(cls):
print '玩具对象的数量是:%d' % cls.count
# 创建玩具对象
toy1 = Toy('乐高')
toy2 = Toy('托马斯')
toy3 = Toy('小猪佩琦')
# 调用类方法
Toy.show_toy_count()
四.静态方法
静态方法:在开发时,如果需要在类中封装一个方法,这个方法即不需要访问实例属性或者调用实例方法,也不需要访问类属性调用类方法,可以将该方法封装为一个静态方法。
定义格式:
@staticmethod def 静态方法名():
pass
class Cat(object):
# 定义一个静态方法
@staticmethod
def demo():
print '小猫喵喵叫!'
Cat.demo() # 直接用类名调用类中的静态方法,不用生成对象来调用
五.类对象,类方法,静态方法的综合实例
需求:
1.设计一个Game类
2.属性:
记录游戏的历史最高分
记录当前游戏玩家的姓名
3.方法:
方法show_help显示游戏帮助
方法show_top_score显示历史最高分
方法start_game开始当前玩家的游戏
4.主程序步骤:
查看程序帮助
查看历史最高分
创建游戏对象,开始游戏
class Game(object):
history_max = 666
def __init__(self, name):
self.name = name
@staticmethod
def show_help():
print '[游戏规则]\n'\
'1.躲避掉落物\n' \
'2.撞击到掉落物血条降低\n' \
'3.吃掉红色的爱心增加血条\n'
@classmethod
def show_top_score(cls):
print '历史的最高分数是:[%d]' % cls.history_max
def start_game(self):
print '%s准备好了吗?游戏马上开始...' % self.name
# 查看游戏帮助
Game.show_help()
# 查看历史最高分
Game.show_top_score()
# 创建游戏玩家
jay = Game('jay')
# 开始游戏
jay.start_game()
综合实例总结:
1.实例化方法:方法内部需要访问实例属性
2.类方法:方法内部只需要访问类属性
3.静态方法:方法内部不需要访问实例属性和类属性
如果在方法内部,既需要访问实例属性,又需要访问类属性,应该定义实例方法