Python面向对象—新旧式类,私有方法,类方法,静态方法

一.私有属性和私有方法

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.静态方法:方法内部不需要访问实例属性和类属性
如果在方法内部,既需要访问实例属性,又需要访问类属性,应该定义实例方法

猜你喜欢

转载自blog.csdn.net/jay_youth/article/details/81161785
今日推荐