一、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面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法的更多相关文章

  1. Python面向对象高级编程:@property--把方法变为属性

    为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: >>> ...

  2. Python - 查看类的方法和属性,dir(),help()

    1. dir()查看类的方法和属性 查看slice类的方法和属性 dir(slice) 2.help() 查看某个方法的文档 查看slice类中的indices方法 help(slice.indice ...

  3. C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是编码中我们最直接打交道的三个结构.      类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字声明一 ...

  4. Python面向对象之常用的特殊方法(5)

    Python面向对象里面有很多特殊方法,例如__init__(构造方法),__del__(析构方法),这些方法对于面向对象编程非常重要,下面列出一些常用的特殊方法 (1)__call__ class ...

  5. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  6. ASP.NET -- WebForm -- HttpResponse 类的方法和属性

    ASP.NET -- WebForm -- HttpResponse 类的方法和属性 1. HttpResponse 类的方法 (1) AddCacheDependency: 将一组缓存依赖项与响应关 ...

  7. Kotlin(2): 优雅地扩展类的方法和属性

    欢迎Follow我的GitHub, 关注我的CSDN. 个人博客: http://www.wangchenlong.org/, 最新内容. Kotlin由JetBrains公司推出, 是兼容Java的 ...

  8. python-获取类名和方法名,动态创建类和方法及属性

    获取类名和方法名1.在函数外部获取函数名称,用.__name__获取2.在函数内部获取当前函数名称,用sys._getframe().f_code.co_name方法获取3.使用inspect模块动态 ...

  9. day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)

    1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...

随机推荐

  1. oracle中add_months函数的用法

    如果需要取上一个月的数据,并且每天都要进行此操作,每次都需要改时间,的确非常的麻烦,所以想到了oracle add_months函数这个函数 oracle add_months函数: oracle a ...

  2. python 打印 九九表

    用Python 打印九九表. print 每打印一行默认会带有换行, 在print语句后加上,end = 't' 会变成tab. 排版会好点. def main(): for i in range(1 ...

  3. 20145216史婧瑶《Java程序设计》第5周学习总结

    20145216 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 8.1 语法与继承架构 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生 ...

  4. 洛谷 P2015 二叉苹果树(codevs5565) 树形dp入门

    dp这一方面的题我都不是很会,所以来练(xue)习(xi),大概把这题弄懂了. 树形dp就是在原本线性上dp改成了在 '树' 这个数据结构上dp. 一般来说,树形dp利用dfs在回溯时进行更新,使用儿 ...

  5. JDK 中的监控与故障处理工具-05 (jstack)

    jstack : stack trace for java jstack 命令用于生成虚拟机当前时刻的线程快照 (threaddump).线程快照是当前虚拟机中每一条线程正在执行的方法堆栈的集合,生成 ...

  6. 数据结构——堆(Heap)大根堆、小根堆

    目录 Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是偏序: Min-heap: 父节点的值小于或等于子节点的值: Max-heap: 父节点的值大于或等于子节点的值 ...

  7. Examining the Rooms - 第一类斯特灵数

    ---恢复内容开始--- 2017-08-10 20:32:37 writer:pprp 题意如下: Recently in Teddy's hometown there is a competiti ...

  8. Python学习札记(十四) Function4 递归函数 & Hanoi Tower

    reference:递归函数 Note 1.在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. eg.计算阶乘: #!/usr/bin/env python3 def ...

  9. Deep Learning入门

    今天在看电影的过程中我忽然想起来几件特别郁闷的事,我居然忘了上周三晚上的计算机接口的实验课!然后我又想起来我又忘了上周六晚上的就业指导!然后一阵恐惧与责备瞬间涌了上来.这事要是在以前我绝对会释然的,可 ...

  10. Linux安装jdk、删除Open jdk

    1.将jdk解压安装完成后,在bin目录下查看当前jdk的版本号 命令: ./java -version 2.编辑修改配置 1. 修改profile文件 进入命令:   vi  /etc/profil ...