python中各种属性与方法深析
在了解类的继承之后,我们需要特别知道以下几个概念及其具体使用:
(1)私有属性;
(2)私有方法;
(3)类属性;
(4)类方法;
(5)静态方法;
注意:python在类中没有声明的话,所有的方法都是公有方法,所有的属性都是公有属性.
一.私有属性和私有方法
私有属性和私有方法应用场景及定义方式
应用场景:
在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到
私有属性就是对象不希望公开的属性
私有方法就是对象不希望公开的方法
定义方法:
在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法
实例演练:
class Women():
def __init__(self,name): --初始化方法也是私有方法
self.name = name
self.__age = 18 --定义age为私有属性
def ___secret(self): --定义secret为私有方法
print '%s 的年龄是 %d' % (self.name,self.__age)
lily = Women('lily')
# 私有属性,在外界不允许直接访问
print lily.age
# 私有方法,外界不允许直接访问
lily.secret()
父类的私有属性和私有方法
1.子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法
2.子类对象可以通过父类的公有方法间接访问到私有属性或私有方法
私有属性和私有方法是对象的隐私,不对外公开,外界以及子类都不能直接访问
私有属性,私有方法常用做一些内部的事情
class A(object):
def __init__(self):
# 在初始化方法中定义了两个属性,一个共有属性,一个私有属性
self.num1 = 100
self.__num2 = 200
# 定义私有方法
#def __test(self):
print '私有方法 %d %d' % (self.num1,self.__num2)
def test(self):
print '公有方法 %d' % self.__num2
self.__test()
class B(A):
def demo(self):
# 在子类的方法中,不能访问父类的私有属性
print '访问父类的私有属性 %d' % self.__num2
# 在子类的方法中,不能调用父类的私有方法
self.test()
# 创建了一个子类对象
b = B()
print b
# 在外界不能直接访问对象的私有属性/调用私有方法
# print b.__num2
# b.__test
b.test()
二.类属性和类方法
Python中一切皆对象
class AAA(): 定义的类属性属于类对象
obj1 =AAA(): 属于实例对象
在运行程序时,类同样会被加载到内存
在python中,类是一个特殊的对象--类对象
除了封装实例(对象)的属性和方法外,类对象还可以有自己的属性和方法
通过 类名. 的方式可以直接访问类的属性或者调用类的方法
类属性就是针对类对象定义的属性
使用赋值语句在class关键字下方可以定义类属性
类属性用于记录于这个类相关的特性
实例演练:
class Tool(object):
# 1.使用了赋值语句定义类属性,记录所有的工具的数量
count = 0
def __init__(self,name):
self.name = name
Tool.count += 1
tool1 = Tool('斧头')
tool2 = Tool('榔头')
tool3 = Tool('梯子')
print Tool.count
类方法就是针对类对象定义的方法
在类方法内部就可以直接访问类属性或者调用其他类方法
语法如下:
@classmethod
def 类方法(cls):
pass
类方法需要修饰器@classmethod来标识,告诉解释器这是一个类方法
实例演练:
class Toy(object):
# 1.定义类属性
count = 0
# 2.定义类方法
@classmethod
def show_toy_count(cls):
#在类方法的内部,访问当前的类属性
print '玩具对象的数量 %d' % cls.count
def __init__(self,name):
self.name = name
# 让类属性的值 +1
Toy.count += 1
# 创建玩具对象
toy1 = Toy('玩具狗')
toy2 = Toy('玩具车')
toy3 = Toy('玩具熊')
# 调用类方法
Toy.show_toy_count()
三.静态方法
静态方法
在开发时,如果需要在类中封装一个方法,这个方法:
既不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候可以把这个方法封装成一个静态方法
语法如下:
@staticmethod
def 静态方法():
pass
静态方法需要修饰器@staticmethod来标识,告诉解释器这是一个静态方法
通过'类名.静态方法()'来调用静态方法
实例演练:
class Cat(object):
@staticmethod
# 静态方法不需要传递第一个参数:self
def call():
print '小猫喵喵叫~'
# 通过类名.调用静态方法(和类方法的调用相似)
# 不需要创建对象,直接可以使用(当然创建对象调用也没问题)
Cat.call()
四.通过了上面的方法和属性的学习,我们现在将它们混合在一起,写一个综合实例。
实例演练:
要求:
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 '@#@[email protected]!$'
@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.静态方法:方法内部不需要访问实例属性和类属性
提问:如果方法内部,既需要访问实例属性,又需要访问类属性,应该定义什么方法?
解答:应该定义实例方法,因为类只有一个,在实例方法的内部可以使用 类名.访问类属性
#######觉得这个特别有意思,实例方法里面访问另一个实例方法。
class Game(object):
# 1.记录历史最高分
top_score = 0
def __init__(self,player_name):
self.player_name = player_name
@staticmethod
def show_help():
print '@#@[email protected]!$'
@classmethod
def show_top_score(cls):
print '历史记录 %d' % cls.top_score
def star_game(self):
print '%s 开始游戏了' % self.player_name
print Game.top_score
def ab(self):
Game.star_game(self)
pass
#1.查看游戏帮助信息
Game.show_help()
# 2.查看历史最高分
Game.show_top_score()
# 创建游戏对象。开启游戏
game = Game('小明')
game.star_game()
game.ab()
其实再想想,和函数的访问是一样的。(并没有多么高大上)
def a():
print 'a'
def b():
a()
print 'b'
b()