一、介绍

在 Python 中,面向对象编程主要有两个主题,就是类和类实例
类与实例:
类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象
的具体信息。

类有这样一些的优点:

1、类对象是多态的:也就是多种形态,这意味着我们可以对不同的类对象使用同样的操作方法,而不需要额外写代码。
2、类的封装:封装之后,可以直接调用类的对象,来操作内部的一些类方法,不需要让使用者看到代码工作的细节。
3、类的继承:类可以从其它类或者元类中继承它们的方法,直接使用。

二、类的定义

1.定义类(class)的语法

>>> class Iplaypython:
>>>     def fname(self, name):
>>>           self.name = name

一第行,语法是class 后面紧接着,类的名字,最后别忘记“冒号”,这样来定义一个类。
类的名字,首字母,有一个不可文的规定,最好是大写,这样需要在代码中识别区分每个类。
第二行开始是类的方法,大家看到了,和函数非常相似,但是与普通函数不同的是,它的内部有一个“self”,参数,它的作用是对于对象自身的引用。

2.初始化对象

创建类时,可以定义一个特定的方法,名为__init__(),只要创建这个类的一个实例就会运行这个方法。可以向__init__()方法传递参数,这样创建对象时就可以把属性设置为你希望的值__init__()这个方法会在创建对象时完成初始化

>>> class peo:
...     def __init__(self,name,age,sex):
...             self.Name = name
...             self.Age = age
...             self.Sex = sex
...     def speak(self):
...             print "my name" + self.Name
...

实例化这个类的对象时:

>>> zhangsan=peo("zhangsan",24,'man')
>>> print zhangsan.Age
24
>>> print zhangsan.Name
zhangsan
>>> print zhangsan.Sex
man

之前多次用到self这个形参类就好比是一张蓝图,使用一个类可以创建多个对象实例,speak()方法在被调用时,必须知道是哪个对象调用了它.

这里self参数就会告诉方法是哪个对象来调用的.这称为实例引用。

3.类的私有属性:

__private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
类的方法
  在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
私有的类方法
  __private_method 两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用slef.__private_methods

4.classmethod类方法

  1. 在python中.类方法 @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。
    类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
  2. 普通对象方法至少需要一个self参数,代表类对象实例
    3)类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
    对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法,
    也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
class info(object):@classmethoddef sayclassmethod(cls):print 'say %s' % clsdef saymethod(self):print 'say %s' % selftest = info()
test.saymethod()##实例调用方法
test.sayclassmethod()##实例调用类方法
info.saymethod(test)##类调用实例方法
info.sayclassmethod()##类调用类方法

大家对比运行下。

5.类的装饰器@property

class Pager:def __init__(self,all_count):self.all_count=all_count@propertydef all_pager(self):a,b=divmod(self.all_count,10)if a==0:return aelse:return  a+1@all_pager.setterdef all_pager(self,value):print(value)@all_pager.deleterdef all_pager(self):print('hehe')
p=Pager(101)
ret=p.all_count#以访问类属性的方法访问对象的方法
print(ret)

下面看第二种方法

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群991032883
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Pager:def __init__(self,all_count):self.all_count=all_countdef f1(self):return 123def f2(self,value):print('======')def f3(self):print('+++++++')foo=property(fget=f1,fset=f2,fdel=f3)
p=Pager(101)
ret=p.foo
p.foo='alex'
print(p.foo)
del p.foo

在该类中定义三个函数,分别用作赋值、取值、删除变量

property函数原型为property(fget=None,fset=None,fdel=None,doc=None),上例根据自己定义相应的函数赋值即可。

三、继承类定义:

1.单继承

class <类名>(父类名)
<语句>

 class childbook(book)age = 10

单继承示例

class student(people):  grade = ''  def __init__(self,n,a,w,g):  #调用父类的构函  people.__init__(self,n,a,w)  self.grade = g  #覆写父类的方法  def speak(self):  print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade))       s = student('ken',20,60,3)  s.speak()

2.类的多重继承
class 类名(父类1,父类2,…,父类n)
<语句1>

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法

另一个类,多重继承之前的准备

class speaker():  topic = ''  name = ''  def __init__(self,n,t):  self.name = n  self.topic = t  def speak(self):  print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic))

多重继承

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群991032883
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class sample(speaker,student):  a =''  def __init__(self,n,a,w,g,t):  student.__init__(self,n,a,w,g)  speaker.__init__(self,n,t)  test = sample("Tim",25,80,4,"Python")
test.speak()#方法名同,默认调用的是在括号中排前地父类的方法

四、类的专业方法

Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样)。

1 __ init__
类似于构造函数

#!/usr/local/bin/python
class Study:def __init__(self,name=None):self.name = namedef say(self):print self.name
study = Study("Badboy")
study.say()

2 __ del__
类似于析构函数

#!/usr/local/bin/python
class Study:def __init__(self,name=None):self.name = namedef __del__(self):print "Iamaway,baby!"def say(self):print self.name
study = Study("zhuzhengjun")
study.say()

3__repr__
使用repr(obj)的时候,会自动调用__repr__函数,该函数返回对象字符串表达式,
用于重建对象,如果eval(repr(obj))会得到一个对象的拷贝。

#!/usr/local/bin/python
class Study:def __init__(self,name=None):self.name = namedef __del__(self):print "Iamaway,baby!"def say(self):print self.namedef __repr__(self):return "Study('jacky')"
study = Study("zhuzhengjun")
study.say()
print type(repr(Study("zhuzhengjun"))) # str
print type(eval(repr(Study("zhuzhengjun")))) # instancestudy = eval(repr(Study("zhuzhengjun")))study.say()

4__str__
Python能用print语句输出内建数据类型。有时,程序员希望定义一个类,要求它的对象也能用print语句输出。Python类可定义特殊方法__str__,为类的对象提供一个不正式的字符串表示。如果类的客户程序包含以下语句:

print objectOfClass

那么Python会调用对象的__str__方法,并输出那个方法所返回的字符串。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群991032883
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/usr/local/bin/pythonclass PhoneNumber:def __init__(self,number):self.areaCode=number[1:4]self.exchange=number[6:9]self.line=number[10:14]def __str__(self):return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)def test():newNumber=raw_input("Enter phone number in the form. (123) 456-7890: \n")phone=PhoneNumber(newNumber)print "The phone number is:"print phoneif__name__=="__main__":test()

方法__init__接收一个形如"(xxx) xxx-xxxx"的字符串。字符串中的每个x都是电话号码的一个位数。方法对字符串进行分解,并将电话号码的不同部分作为属性存储。

方法__str__是一个特殊方法,它构造并返回PhoneNumber类的一个对象的字符串表示。解析器一旦遇到如下语句:

print phone

就会执行以下语句:

print phone.__str__()

程序如果将PhoneNumber对象传给内建函数str(如str(phone)),或者为PhoneNumber对象使用字符串格式化运算符%(例如"%s"%phone),Python也会调用__str__方法。

5__cmp __
比较运算符,0:等于 1:大于 -1:小于

class Study:  def __cmp__(self, other):  if other > 0 :  return 1  elif other < 0:  return - 1  else:  return 0  study = Study()
if study > -10:print 'ok1'
if study < -10:print 'ok2'
if study == 0:print 'ok3'

打印:ok2 ok3
说明:在对类进行比较时,python自动调用__cmp__方法,如-10 < 0 返回 -1,也就是说study 应该小与 -10,估打印ok2

6__getitem__
__ getitem__ 专用方法很简单。象普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。

class Zoo:  def __getitem__(self, key):  if key == 'dog':return 'dog'  elif key == 'pig':return  'pig'  elif key == 'wolf':return 'wolf'  else:return 'unknown'  zoo = Zoo()
print zoo['dog']
print zoo['pig']
print zoo['wolf']

打印 dog pig wolf

7__setitem__
setitem 简单地重定向到真正的字典 self.data ,让它来进行工作。

class Zoo:  def __setitem__(self, key, value):  print 'key=%s,value=%s' % (key, value)  zoo = Zoo()
zoo['a'] = 'a'
zoo['b'] = 'b'
zoo['c'] = 'c'
打印:
key=a,value=a
key=b,value=b
key=c,value=c

8 __ delitem__
delitem 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 delitem 专用方法。

class A:  def __delitem__(self, key):  print 'delete item:%s' %key  a = A()
del a['key']

python学习,什么是类?相关推荐

  1. Python学习笔记 (类与对象)

    Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...

  2. Python学习,枚举类定义和使用

    一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个:再比如用一个类表示季节,则该类的实例化对象最多有 4 个. 针对这种特殊的类,Python ...

  3. python学习之【类和对象】

    前言 五一快乐! 上一篇文章python学习--[第八弹]中,给大家介绍了python中的函数,这篇文章接着学习python中的类和对象. 我们知道,python中一切皆对象.在这篇文章开始之前,我们 ...

  4. python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程

    一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习. 声明:本人学习是在扇贝编程通过网络学习的,相关的知识.案例来源于扇贝编程.如果使用请说明来源. 第27关 类与面向对 ...

  5. 【Python学习】导入类

    # _*_ coding:utf-8 _*_ """ name:zhangxingzai date:2022/11/20 form:<Python编程从入门到实践& ...

  6. Python学习-面向对象(类)

    1 了解面向对象 Python 就是一个面向对象的编程语言 对象就是内存中用来存储指定数据的一块区间 对象的结构:每个对象当中都保存了3种数据: 1.id(标识):id是由我们的解析器生成的,在Cyt ...

  7. Python学习,元类type 反射 函数与方法 双下方法

    1.元类type type 获取对象从属于的类 python 中 一切皆对象, 类在某种意义上也是一个对象, python中自己定义的类, 以及大部分内置类, 都是由type元类(构建类)实例化得来的 ...

  8. Python 学习笔记13 类 - 继承

    我们在编程的过程中,并非都是要重头开始.比如其他人已经有现成的类,我们可以使用其他找人编写的类.术语称之为: 继承. 当一个类继承例外一个类时,它可以获得这个类的所有属性和方法:原有的类称之为 父类, ...

  9. Python学习记录之-----类

    面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...

  10. Python学习笔记:类

    本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python 简介 Python流程介绍:深入Python 流程 Python数据结构 ...

最新文章

  1. php单元测试断言方法
  2. python爬虫学习:爬虫QQ说说并生成词云图,回忆满满
  3. codeup 1943进制转换
  4. 房贷断供会有什么严重后果?
  5. matlab kfda,SVD与KFDA相结合人脸识别-matlab-毕业论文
  6. cocos2d-x Lua与OC互相调用
  7. Hystrix 熔断器舱壁模式
  8. Andorid 系统性能优化---(22)Android性能相关常用命令收集
  9. 对我来说,只有一件事情是重要的
  10. 一脸懵逼的算法系列之汉诺塔
  11. android内存碎片问题优化梳理
  12. 电流速断保护c语言程序,[单选] 电流电压联锁速断保护与过电流保护十分相似,只是取消了()继电器。...
  13. 有哪些好用的word文件对比工具
  14. 2018最新微信小程序经典案例开发视频教程合集
  15. Python+Selenium爬取新浪微博评论数据
  16. qt android图片自适应大小,Qt on Android:怎样适应不同的屏幕尺寸
  17. 利用Javascript生成txt文本文件
  18. 【jmeter】JMeter日志查看与日志分析
  19. 从光学成像到计算光学成像
  20. ​力扣解法汇总1728-猫和老鼠 II

热门文章

  1. 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射
  2. 基于PHP+MySQL的在线投票系统设计与实现
  3. mathematica中画图技巧
  4. Android特效专辑(一)——水波纹过渡特效(首页)
  5. Java基础50题(3) 21~30题
  6. 基于QtQuick2.0应用程序运行于XP系统的诸多问题
  7. 广东阶段丰收成定局 国稻种芯·中国水稻节:肇庆鱼塘上首次
  8. android 判断手机系统语言是否是简体中文的最新方法
  9. webApp滚动选择器-实践与应用
  10. Tomat 8005端口安全问题