• Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法


    一、Python面向对象中的新旧式类

      1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object)。在python3.x中若没有指定父类,会默认使用的是object作为基类;在python2.x中,若没指定父类,则不会以object作为基类。

      2)旧式类(经典类):在定义类时,类后边括号中不用继承object类,甚至不用括号。

      3)dir方法是用来查看类的内置方法。

    二、私有方法和属性

      1)私有属性是对象不希望公开的属性;私有方法是对象不希望公开的方法。在定义私有属性和方法时,在属性或方法名之前添加 __(两个下划线)

    #定义一个man类

    class Man(object):

       def __init__(self,name,age):

           self.name = name

           self.__age = age       # 定义一个私有属性age

       def __secret(self):

           print "%s的年龄是:%s" %(self.name,self.__age)

       def test(self):            # 公有类可以调用私有属性和私有方法

           self.__secret()

    demo = Man('demo',18)

    # 不能访问私有属性

    # print demo.age

    # 也不能访问私有方法

    # demo.secret()

    demo.test()

       2)继承中私有属性和私有方法问题:子类不可以继承父类的私有属性和私有方法
    class A(object):

       def __init__self(self,name):

           self.__age = 18    # 定义一个私有属性和公有属性

           self.name = name

       def __secret(self):

           print "%s的年龄是%s" %(self.name,self.__age)

    class B(A):

       def test(self):

           print self.name

           # 不能访问父类私有属性和方法

           # print self.__age  

           # self.__secret()

    demo = A('demo')


    # 在外界也不可以访问父类的私有属性和方法

    demo.test

    三、类属性和类方法

      1)类对象:类是一个特殊的对象,也叫类对象。故类对象也有自己对应的属性和方法,叫做类属性和类方法。

      2)类属性:就是给类对象定义的属性;通常用来记录与类相关的特征;不会记录具体对象的特征。在class关键字的下方定义。

      3)类方法:针对类对象定义的方法;在类方法内部只可以调用类属性或类方法定义格式为:@classmethod  def 类名():  pass

    class Toy(object):

       count = 0       # 使用赋值语句定义类属性

       def __init__(self,name):

           self.name = name

           Toy.count += 1   # 每次创建对象,计数器加1

       @classmethod    # 定义类方法的标识

       def show_toy_count(cls):

           print "玩具对象的数量为%d"  %cls.count

    # 创建玩具对象

    toy1 = Toy('乐高')

    toy2 = Toy('玩具车')

    Toy.count               # 调用类属性

    Toy.show_toy_count()    # 调用类方法

    四、静态方法

       1)静态方法:在开发的时候,如果需要在类中封装一个方法;这个方法不需要访问实例属性或者实例方法,也不需要访问类属性或类方法;此时我们可以把这个方法封装为静态方法。定义格式为:@staticmethod   def 类名():   pass

    class Cat(object): 
        @staticmethod

        # 不能访问实例属性/类属性

        # 静态方法不需要传递第一个参数self

        def  call():

            print "喵喵喵~~~"

    # 通过 '类名.静态方法' 来调用;(不需要创建对象就可以直接调用静态方法)

    Cat.call()    

     
    五、类对象、类属性、静态方法的综合实例

      1)需求:设计一个game类

         属性:定义一个属性top_score记录游戏的历史最高分(类属性)
              定义一个属性player_name记录当前游戏玩家的玩家姓名(实例属性)
         方法:
              show_help显示游戏帮助信息(静态方法,自己的参数)
              show_top_socre显示历史最高分(类方法,参数为cls)
              start_game开始当前玩家的游戏(实例方法,参数为self)
    import random

    class Game(object):
        top_score = 0     # 定义一个类属性,计算最高成绩
        def __init__(self, name):
            self.play_name = name
            Game.top_score = 0    # 初始化为0
        @staticmethod
        def show_help():          # 定义静态函数
            print "游戏帮助"
            print "随机生成1-10的数字。猜三次!第一次猜对10分;第二次猜对5分,第三次猜对3分;猜不对0分!猜完之后,会记录你的最高成绩!"

        def start_game(self):  # 定义实例方法
            num = random.randint(1, 10)
            score = 0
            for i in range(3):
                guest = int(raw_input("请输入猜测的数字:"))
                if guest == num:
                    if i == 0:
                        score += 10
                        break
                    elif i == 1:
                        score += 5
                        break
                    else:
                        score += 3
                        break
                else:
                    score = 0
            print "小明的成绩为%d" % score
            if score > Game.top_score:
                Game.top_score = score

        @classmethod   
        def show_top_socre(cls):    # 创建一个类方法,显示游戏的最高成绩
            print "显示最高成绩:%s" % cls.top_score

    # 查看游戏帮助

    Game.show_help()

    # 创建玩游戏对象

    xming = Game('小明') 

    # 开始玩游戏

    xming.start_game()

    # 查看历史最高分

    Game.show_top_socre()

     

    实例总结:

    1、实例方法:方法内部需要访问实例属性。

    2、类方法:方法内部‘只’访问类属性

    3、静态方法:方法内部,不需要访问实例属性和类属性

    4、在方法内部,既需要访问实例属性,有需要访问类属性,则可以定义为实例方法


  • 相关阅读:
    Python下划线简介
    OneHot编码
    搜狗新闻原始数据处理
    2. mirth connect探索------------ cs模式客户端登录
    System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。 ---> System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效。
    python学习历程-安装篇(一)
    Python学习笔记(一)
    使用dva 搭建ant design mobile项目
    [error] OpenEvent("Global gx_stop_25184") failed (2: The system cannot find the file specified)
    nginx 上部署 react 项目
  • 原文地址:https://www.cnblogs.com/uthnb/p/9610166.html
Copyright © 2020-2023  润新知