类是事物功能和属性的抽象,对象是类的实例化。就像人人都知道小汽车可以干什么什么的,但光想小汽车如何好是没有用的,得开车或坐才能感受到小汽车的好。人脑里的小汽车是抽象的,即类,而坐上的某辆车是小汽车的实例化,即对象。所以,如果一门语言提供了、支持面向对象编程的机制,那么首先得先设计程序所需要的类,然后再在程序里将这些类实例化产生对象,通过对象这个程序元素(和变量、函数等起着相同的作用,构成程序的基本元素),所以类的设计是面向对象编程是否有效、合理、成功的关键。

类总的来说是专有数据用专用方法处理,即数据和处理数据方法的集合,故类的里有数据(属性)和函数(功能),且类里的数据必须用类里的方法来操作处理。

类里的这些函数也有时又称方法、成员函数,如果方法或函数作用于类本身称之为类方法,如果方法作用于由类产生出的实例对象上,这些方法称之为实例对象的方法。类里的数据称为属性(类属性和实例对象属性)、成员变量。

类不能无源而生,需有自己的父类,而object这个类是Python下的根类(base class),也就是说用户自己的类可以继承object 这个类作为自己(父)类的起点,类的父类需要用圆括号括起来放在类名字的后边。

定义类

基于上边讲述,定义一个常规的类格式如下:

class 类名字(父类序列):    类的成员变量 = 初值    def __init__(self, 形参序列):        self.实例对象的成员变量名 = 初值        其他语句

    def 其他实例对象函数名(self,形参序列):        语句

    @classmethond    def 类的成员函数名(cls,形参序列):        cls.类的成员变量名 = 初值        语句

    @staticmethond    def 函数名(形参序列):        语句

类的语法格式里出现了一些奇奇怪怪的符号,下面一一解释一下。class和定义函数的def一样是Python里的关键字,用于定义一个类的标识符。

位于class下和_ _init_ _函数间声明的变量是类的变量,可被类或类的对象共有。

__init__可以成为类的实例对象的构造函数,每次通过类创建一个该类的对象是调用此函数,所以其下的以sefl.前缀的变量是每个创建好了的实例(化)对象的所独有的。换句话说,有多少个类的对象内存里就有多少份这个实例对象变量存在。就像生产了多少小汽车就有多少个方向盘似的。

self代表运行时的类的实例对象本身,一般在类的内部设计时出现,在程序里使用对象编程时不用self。在实例对象的成员函数里以self.前缀的变量是实例对象的成员变量,没有self.的变量是本方法函数的局部变量。

cls和self出现在构造和实例对象函数的第一个参数位置上一样,cls关键字出现在类的方法函数里,区分于对象函数和变量时会用到。在类的函数里以cls.前缀的变量也是类的成员变量,没有这个前缀的是局部变量。

@classmethon这个关键字是修饰器,修饰也是说下面的函数是类的方法函数而不是类的对象的方法函数。

@staticmethod这个也是修饰器,说明接下来的函数是一个静态函数,和实例对象的成员函数、类函数的区别主要在第一个形参,既无self又无cls。可以被类或对象直接调用。差不多解释完了,下面来看一个具体的类的实例程序。

定义一个类的示例

下面创建一个Horse类,类里除了有实例对象的方法函数、类方法函数和静态方法函数,还有实例对象成员变量和类变量。

# coding:utf-8class Horse(object):    variety = "大宛马"    def __init__(self, name = "green", height = 0.5, length = 1.3, sex = "male"):           self.name = name        self.height = height        self.length = length        self.sex = sex        print "A baby horse is born called", self.name    @classmethod    def pp(cls):        print cls.variety, Horse.variety, cls.address    @classmethod    def print_variety(cls):        cls.address = "xi'an"        print cls.variety, Horse.variety, cls.address        Horse.pp()

    def print_info(self):        print self.name, self.height, self.length, self.sex, Horse.variety#,Horse.address        Horse.print_variety()

    @staticmethod    def print_ci(x, y):        print x, y

1).出现在class下一行的variety是类Horse的变量,是类变量,可以通过Horse.variety在类的内部或者外部任何地方被访问。

2).__init__函数是Horse类的实例对象的构造函数,每次创建一个Horse类的实例对象时,这个函数均会被调用执行,其下以self.开始的变量是每个实例对象的成员变量,即标的这个实例对象的属性、特征用的。

3). 用修饰器@classmethod修饰的两个函数pp、print_variety,是类Horse的类函数,类函数只可通过类或cls使用。在pp这个函数里可以看出一点,在类的内部类变量的使用需前缀类名.或cls.。

类名.类变量cls.类变量

从print_variety函数可以看出,在类的内部可以通过类调用类的方法函数。

类名.类方法

4).用@staticmethod修饰的print_ci函数是静态函数,它的第一个参数不是特殊的self或者cls,静态函数可在类内部或类的外部调用,也可被类的对象调用。

创建对象

面向对象编程实际是在设计好类以后,用与类同名的函数来创建类的对象,用类的对象调用对象的方法函数来编写整个程序,有时可能根据需要少量地用类调用类方法的语句代码出现,一般都是对象调用类里设计好的对象方法函数来完成整个程序的功能,故称面向对象编程。

创建类的实例对象的语法:

变量 = 类名([参数序列])

通过这样的方式创建类的实例对象本质是调用了类里的_ _ init_ ()方法函数,括号里的[参数序列]意思是看 _ init_ _()方法函数是否有除self外的其他形参,如无,换括号里没有任何实参。

需要特别说明的是任何实例对象的self形参不用赋值,在Python解译执行程序语句时self代表点儿运算符(.)前的实例对象,或者说self被Python赋值为点儿运算符前的实例对象。

a = Horse(sex = "male")b = Horse(name = "marong", sex = "female")

面向对象编程示例

面向对象编程,需要两步,第一步先设计好类,第二步基于类创建对象并通过对象调用函数来完成整个程序需要实现的功能。下面是本节课设计的一个Horse类的面向对象程序设计的完整示例。

# coding:utf-8class Horse(object):    variety = "大宛马"    def __init__(self, name = "green", height = 0.5, length = 1.3, sex = "male"):               # self.name是成员变量,name是形参、局部变量        self.name = name        self.height = height        self.length = length        self.sex = sex        print "A baby horse is born called", self.name

    def print_info(self):        print self.name, self.height, self.length, self.sex, Horse.variety#,Horse.address        Horse.print_variety() # 在对象方法里通过类调用类方法,避免        Horse().print_ci(200, 100)# 对象调用静态方法        Horse.print_ci(200, 100) # 类调用静态方法

    @staticmethod    def print_ci(x, y):        print x, y

    @classmethod    def pp(cls):        # 类使用类变量        print cls.variety, Horse.variety, cls.address        #cls.print_variety()        print Horse().name  # 对象使用对象的成员变量    @classmethod    def print_variety(cls):        cls.address = "xi'an"        print "type", type(cls.address)        print cls.variety, Horse.variety, cls.address        Horse.pp()# 类调用类方法        Horse().print_ci(100, 100)# 对象调用静态方法

a = Horse("xiaoxuanfeng")b = Horse("pilihuo", sex = "female")a.print_info()b.print_info()Horse.print_variety()print "*" * 20Horse.pp() # 类调用类方法Horse.print_ci(12, 23)# 类外类调用静态方法a.print_ci(23, 31) # 类外对象调用静态方法

原文来自:http://suo.im/5MEtwN

python中扑克牌类设计_Python类的基础设计、使用相关推荐

  1. python中getattr详解_Python类中方法getitem和getattr详解

    请分享高手帮小编详解一下Python中的getattr内置函数没明白这个内置函数得意思.麻烦帮小编讲解一下. 其实这个方法最主要的作用是实现反射机制.也就是说可以通过字符串获取方法实例.这样,你就可以 ...

  2. python中init和属性_python类的属性不在\uyu init中__

    它是类属性.实例属性和动态属性.当您这样做时:class Car(): def __init__(self): pass c = Car() c.speed = 3 c.time = 5 speed和 ...

  3. python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

    首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 ...

  4. python导入类有红线_解决Python中导入自己写的类,被划红线,但不影响执行的问题...

    1. 错误描述 之前在学习Python的过程中,导入自己写的包文件时,与之相关的方法等都会被划红线,但并不影响代码执行,如图: 看着红线确实有点强迫症,并且在这个过程当时,当使用该文件里的方法时不会自 ...

  5. python中什么最重要_Python 3中被忽视了的三大重要功能

    全文共2201字,预计学习时长6分钟 图源:unsplash Python 3上线已有一段时间,大多数开发人员(特别是那些首次编程的人)已经在使用它了.不过,你确定已经对Python 3研究透彻了吗? ...

  6. python中扑克牌类设计_Python中的计数 Counter类

    点击上方"AI机器学习与深度学习算法",选择"星标"公众号 原创干货,第一时间送达 在很多场景中经常会用到统计计数的需求,比如在实现 kNN 算法时统计 k 个 ...

  7. python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...

    python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...

  8. python什么时候用类设计_Python 类的设计与 Java 类的设计有何区别?

    读前声明:本文主要参考了Real Python中的内容,提炼了一些主要的内容,如果英文还不错的想详细了解的话建议直接进入该网站阅读. 提到类的设计,我们不得不提及面向对象(OOP),它是一种编程思想, ...

  9. python的类作用_python——类中的self到底的作用及三个应用场景

    class Test(object): def __init__ (self, val1): self.val0 = val1 def fun1(self): print(self.val0) def ...

最新文章

  1. 《科学》十大年度科学突破反映的新动向
  2. 用PlanAhead进行RTL代码开发与分析
  3. 【数学建模】MATLAB应用实战系列(九十三)-岭回归应用案例(附MATLAB和Python代码)
  4. 发表论文的十条金玉良言
  5. DBMS、hdfs、hive之间的数据转换之sqoop
  6. ospf hello时间和dead_图文并茂解释OSPF邻居关系建立失败的几种常见情况(太实用了!)...
  7. centos7源代码安装mysql5.7_CentOS7源码编译安装MySQL5.7.11
  8. .Net Core 全局配置读取管理方法 ConfigurationManager
  9. C排序算法:(一)直接排序
  10. ECMAScript 6 -- let和const命令
  11. 等保2.0安全管理制度对比_一手资料!等保2.0云计算安全与风险评估
  12. 机器学习集成模型学习——Boosting集成学习(四)
  13. Xcode 代码格式化/自动排版
  14. 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问...
  15. Tensorflow:tf.contrib.lookup索引构建和查询
  16. 利用VB2005制作颜色渐变的进度条
  17. 当面试问到自己有哪些缺点应该怎么回答
  18. 关于工作和生活的点滴心得
  19. 吸顶那个叫什么_吸顶空调吊顶区别到底是什么
  20. 【集训Day1】 Dwarves line up

热门文章

  1. 算法: 把字字符串转化为整数;
  2. Vue_VueResource
  3. 迎接“云”时代的全面到来
  4. numpy矩阵运算和常用函数
  5. oracle sql语句怎么查询所有存储过程中是否包含某个注释?
  6. GridView中FooterTemplate模板下内容不显示
  7. 四种利用C#播放声音的方法
  8. Java——遍历List过程中添加和删除元素的问题(亲测第二种)
  9. MySQL对in里面数据进行指定排序:order by field
  10. java 处理表单_java – 处理multipart / form-data输入