私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法。在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线)
公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用
class Women:
def __init__(self, name):
self.name = name
#定义一个私有属性__age
self.__age = 18
#定义一个私有方法__secret
def __secret(self):
print '%s 的年龄是 %d' % (self.name, self.age)
# 不能访问私有属性和私有方法
lily = Women('lily')
print lily.age
lily.secret()
继承中私有属性和私有方法问题:子类不能继承父类的私有属性,不能调用父类的私有方法。
父类中的私有属性和私有方法:
1.子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法
2.子类对象可以通过父类的共有方法简介访问到私有属性或私有方法
3.私有属性和私有方法是对象的隐私,不对外公开,外界以及子类都不能直接调用
class A(object):
def __init__(self):
# 在初始化方法中定义了两个属性,一个共有属性,一个私有属性
self.num1 = 10
self.__num2 = 20
# 定义私有方法
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
b.demo()
在外部访问父类的私有属性的方法
class A(object):
def __init__(self):
# 在初始化方法中定义了两个属性,一个共有属性,一个私有属性
self.num1 = 10
self.__num2 = 20
# 定义私有方法
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):
self.test()
b = B()
print b
b.demo()
使用面向对象开发,第一步是设计类
使用类名()创建对象,创建对象的动作有两步
1.在内存中为 对象分配空间
2.调用初始化方法__init__
为对象初始化
对象创建后,内存中就有了一个对象的实实在在的存在
因此:
1.创建出来的对象叫做类的实例化
2.创建对象的动作叫做实例化
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例方法
在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法可以用self
访问自己的属性 ,调用自己的方法
结论:
1.每一个对象都有自己独立的内存空间
2.多个对象的方法,在内存中还有一份,在调用方法时,需要把对象的引用传递到方法内部
类是一个特殊的对象:
Python中一切皆对象
class AAA:定义的类属性属于类对象
obj1 = AAA:属于实例对象
在程序运行中,类会被加载到内存;在python中,类是一个特殊的对象–类对象
除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
通过类名. 的方式可以直接访问类的属性或者调用类的方法
【实例演示】
class Tools(object):
# 使用了赋值语句定义类属性,记录所有工具的数量
count = 0
def __init__(self, name):
self.name = name
Tools.count += 1
# 创建了工具对象(对象在创建的时候,会自动调用初始化方法)
tool1 = Tools('榔头')
tool2 = Tools('梯子')
tool3 = Tools('起子')
# 输出工具对象的总数
# 使用类名.属性名 来获取
print Tools.count
类属性就是针对类对象定义的属性,使用赋值语句在class关键字下方可以定义类属性,用于记录这个类的相关特性 |
类方法就是针对类对象定义额方法,在类方法内部就可以直接访问类属性或者调用其他类方法 |
语法如下:
@classmethod
def 类方法(cls):
pass
class Toy(object):
# 1.定义类属性
count = 0
# 2.定义类方法
@classmethod
def show_toy_count(cls):
# cls.count:在类方法的内部,访问当前的属性
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()
【1】概念
在开发时候,如果需要在类中封装一个方法,这个方法:
即不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法
此时可以将这个方法封装成一个静态方法
【2】基本语法
语法如下:
@staticmethod
def 静态方法():
pass
静态方法需要用修饰器@staticmethod来标识,告诉解释器这是一个静态方法
通过类名,调用静态方法
class Cat(object):
@staticmethod
# 静态方法不需要传递第一个参数:self
def call():
print 'miaomiao~'
# 通过类名.方法名 调用静态方法方法
# 不需要创建对象,可以直接使用
Cat.call()
class Game(object):
# 定义类属性
top_score = 999
# 定义实例属性
def __init__(self, player_name):
self.player_name = player_name
# 定义静态方法
@staticmethod
def show_help():
print '帮助信息'
# 定义类方法
@classmethod
def show_top_score(cls):
print '最高分是:%d !' % cls.top_score
# 定义实例方法
def start_game(self):
print '%s ,游戏开始!!' % self.player_name
Game.show_help()
Game.show_top_score()
game = Game('玛丽兄弟')
game.start_game()
案例小结:
1.实例方法:方法内部需要访问实例属性
2.类方法:方法内部需要访问类属性
3.静态方法:方法内部不需要访问实例属性和类属性
Q:如果方法内部,既要访问实例属性,又徐亚访问类属性,应定义什么方法?
A:实例方法
单例:让类创建的对象,在系统中只有唯一的一个实例
使用类名()创建对象的时候,python的解释器首先会调用__new__
方法为对象分配空间
__new__
是一个由object基类提供的内置的静态方法,主要有两个作用:
1.在内存中为变量分配空间
2.返回对象的引用
python的解释器获得对象的引用后,将引用作为第一个参数传给__init__
方法
__new__
负责给对象分配空间 __init__
负责给对象初始化
class MusicPlayer(object):
instance = None
def __new__(cls, *args, **kwargs):
# 创建对象的时候,new方法会被自动调用
# 重写父类的方法,进行扩展
# 1.创建对象,new方法被自动调用
print '创建对象,分配空间'
# 2.为对象分配空间
instance = object.__new__(cls)
# 3.返回对象的引用
return instance
def __init__(self):
print '播放器初始化'
player1 = MusicPlayer()
print player1
class MusicPlayer(object):
instance = None
def __new__(cls, *args, **kwargs):
# 创建对象的时候,new方法会被自动调用
# 重写父类的方法,进行扩展
if cls.instance is None:
cls.instance = object.__new__(cls)
return cls.instance
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2