一.私有属性和私有方法
私有属性和私有方法
应用场景及定义方法
应用场景
在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用而不希望在外部被访问到
私有属性:就是对象不希望公开的属性
私有方法:就是对象不希望公开的方法
定义方法
在定义属性或方法时,在属性名或者方法名前增加两个下划线定义的就是私有属性或方法
1.练习-01
2.父类的私有属性和私有方法
父类的私有属性和私有方法
1.子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法
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):
def demo(self):
#在子类的方法中,不能访问父类的私有属性
print '访问父类的私有属性 %d' % self.__num2
# 在子类的方法中,不能调用父类的私有方法
self.__test()
pass
#创建了一个子类对象
b = B()
print b
# 在外界不能直接访问对象的私有属性/调用私有方法
# print b.__num2
# b.__test
b.demo()
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):
def demo(self):
#在子类的方法中,不能访问父类的私有属性
print '访问父类的私有属性 %d' % self.__num2
# 在子类的方法中,不能调用父类的私有方法
self.__test()
pass
#创建了一个子类对象
b = B()
print b
# 在外界不能直接访问对象的私有属性/调用私有方法
# print b.__num2
# b.__test
b.test()
二.类结构与类属性-类方法
1.类结构
类的结构
实例:
1.使用面向对象开发,第一步是设计类
2.使用 类名() 创建对象,创建对象的动作有两步
1.在内存中为对象分配空间
2.调用初始化方法__init__ 为对象初始化
3.对象创建后,内存中就有了一个对象的实实在在的存在--实例
因此:
1.创建出来的对象叫做类的实例
2.创建对象的动作叫做实例比
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例方法
在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
访问自己的属性
调用自己的方法
结论:
1.每一个对象都有自己独立的内存空间,保存各自不同的属性
2.多个对象的方法,在内存中之有一份,在调用方法时,需要把对象的引用传递到方法的内部。
2.类属性-类方法
类是一个特殊的对象
Python中一切皆对象
class AAA:定义的类属性属于类对象
obj1 =AAA:属于实例对象
在运行程序时,类 同样会被加载到内存
在Python中, 类 是一个特殊的对象--类对象
除了封装 实例 的属性和方法外,类对象还可以有自己的属性和方法
通过类名. 的方式可以直接访问类的属性或者调用类的方法
类属性就是针对类对象定义的属性
使用赋值语句在class关键字下方可以定义类型属性
类属性用于记录于这个类相关的特性
类方法就是针对类对象定义的方法
在类方法内部就可以直接访问类属性或者调用其他类方法
语法如下:
@classmethod
def 类方法(cls):
pass
静态方法
在开发时,如果需要在类中封装一个方法,这个方法:
既不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候可以把这个方法封装成一个静态方法
语法如下:
@staticmethod
def 静态方法
pass
静态方法需要修饰器@staticmethod来标识,告诉解释器这是一个静态方法
通过类名,调用静态方法
综合练习
1.设计一个Game类
2.属性:
类属性,记录游戏的历史最高分(与这个游戏类有关系,与每次游戏无关)
实例属性,记录当前游戏玩家的玩家姓名
3.方法:
静态方法,方法show_help显示游戏帮助信息
类方法,方法show_top_score显示历史最高分
实例方法:方法start_game开始当前玩家的游戏
4.主程序步骤
1.查看帮助信息
2.查看历史最高分
3.创建游戏对象,开始游戏
class Game(object):
#1.记录历史最高分
top_score = 0
def __init__(self,player_name):
self.player_name = player_name
@staticmethod
def show_help():
print 'help'
@classmethod
def show_top_score(cls):
print '历史记录 %d' % cls.top_score
def star_game(self):
print '%s 开始游戏了' % self.player_name
#1.查看游戏帮助信息
Game.show_help()
#2.查看历史最高分
Game.show_top_score()
#创建游戏对象,开启游戏
game = Game('小明')
game.star_game()
"""
案例小结
1.实例方法:方法内部需要访问实例属性
2.类方法:方法内部只需要访问类属性
3.静态方法:方法内部不需要访问实例属性和类属性
"""
三.设计模式
使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间
__new__是一个由object基类提供的内置的静态方法,主要有两个作用:
1.在内存中为对象分配空间
2.返回对象的引用
python的解释器获得对象的引用后,将引用作为第一个参数,传递__init__方法
#__new__:负责给对象分配空间 __init__(初始化方法)负责给对象初始化
只执行一次初始化工作
在每次使用 类名()创建对象时,python的解释器都会自动调用两个方法
__new__ 分配空间
__init__ 对象初始化
但在上一小结中 __new__方法改造之后,每次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次调用
class MusicPlayer(object):
instance = None
init_flag = False
def __new__(cls, *args, **kwargs):
# 第一个参数cls:哪一个类调用,就传递那一类
# 第二个参数*args:多值参数
# 第三个参数**kwargs:多值参数
# 创建对象的时候,new方法会被自动调用
# 重写了父类的方法
if cls.instance is None:
cls.instance = object.__new__(cls)
return cls.instance
def __init__(self):
if MusicPlayer.init_flag:
return
print '初始化播放器'
MusicPlayer.init_flag=True
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2