Python中的私有属性私有方法、类属性类方法以及单例设计模式

一、私有属性和私有方法

1.基础信息

私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法。在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线)
公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用

2.相关实例

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.类的结构

使用面向对象开发,第一步是设计类
使用类名()创建对象,创建对象的动作有两步

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

这里写图片描述

2.类属性类方法

类属性就是针对类对象定义的属性,使用赋值语句在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()

这里写图片描述

3.静态方法

【1】概念
在开发时候,如果需要在类中封装一个方法,这个方法:
即不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法
此时可以将这个方法封装成一个静态方法
【2】基本语法

语法如下:
@staticmethod
def 静态方法():
pass

静态方法需要用修饰器@staticmethod来标识,告诉解释器这是一个静态方法
通过类名,调用静态方法

class Cat(object):
    @staticmethod
    # 静态方法不需要传递第一个参数:self
    def call():
        print 'miaomiao~'

# 通过类名.方法名 调用静态方法方法
# 不需要创建对象,可以直接使用
Cat.call()

这里写图片描述

4.综合应用

需求如下:
这里写图片描述


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:实例方法

三、单例设计模式

1.概念

单例:让类创建的对象,在系统中只有唯一的一个实例

2.相关实例

使用类名()创建对象的时候,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

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值