一、介绍

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

类有这样一些的优点:

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

二、类的定义

1.定义类(class)的语法

1 >>> class Iplaypython:
2 >>>     def fname(self, name):
3 >>>           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):

  @classmethod
  def sayclassmethod(cls):

    print 'say %s' % cls

  def saymethod(self):

    print 'say %s' % self

test = info()
test.saymethod()##实例调用方法
test.sayclassmethod()##实例调用类方法
info.saymethod(test)##类调用实例方法
info.sayclassmethod()##类调用类方法

大家对比运行下。

5.类的装饰器@property

class Pager:
    def __init__(self,all_count):
        self.all_count=all_count
    @property
    def all_pager(self):
        a,b=divmod(self.all_count,10)
        if a==0:
            return a
        else:
            return  a+1

@all_pager.setter
    def all_pager(self,value):
        print(value)

@all_pager.deleter
    def all_pager(self):
        print('hehe')
p=Pager(101)
ret=p.all_count#以访问类属性的方法访问对象的方法
print(ret)

下面看第二种方法

class Pager:
    def __init__(self,all_count):
        self.all_count=all_count
    def f1(self):
        return 123
    def 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))

#多重继承  

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 = name
        def 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 = name
        def __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 = name
        def __del__(self):
                print "Iamaway,baby!"
        def say(self):
                print self.name
        def __repr__(self):
                return "Study('jacky')"
study = Study("zhuzhengjun")
study.say()
print type(repr(Study("zhuzhengjun"))) # str
print type(eval(repr(Study("zhuzhengjun")))) # instance

study = eval(repr(Study("zhuzhengjun")))

study.say()

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

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

#!/usr/local/bin/python

class 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 phone

if__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类的方法中定义函数

    代码: class A():def run(self):def p():print('hello')p()a = A() a.run() 输出: hello 注意类中方法和普通函数的区别,python ...

  2. python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...

    在Python中, 继承是指子类对父类资源的使用权 1 继承-属性与方法的使用权限 1.1 测试属性与方法分别如下 公有属性/方法 受保护属性/方法 私有属性/方法 class Animal: a = ...

  3. python类添加方法以及pow和cmp的使用

    python装饰器@classmethod 定义:classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法 使用方法: eg:在Date_test类里面创建一个成员函数 ...

  4. python 类 实例 方法 涉及到的名称定义

    参考文档:Python基础-类变量和实例变量 - 珞樱缤纷 - 博客园 [小记]python 中类和方法的区别_yaoyz105-CSDN博客_python类和方法的区别 1.类 类定义:class ...

  5. python类之间方法互相调用_Python中类与类之间属性和方法的调用

    Python中类与类之间属性和方法的调用 class A(object):  #定义一个类 name='python' #类属性 def __init__(self): #实例属性 self.age= ...

  6. python 类中方法的动态特性

    2019独角兽企业重金招聘Python工程师标准>>> 方法添加 class  Fruit(object): pass def add(self): print "grow ...

  7. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  8. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  9. python类中方法的执行顺序-Python实例化class的执行顺序实例方法

    Python中实例化class的执行顺序示例详解 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的 ...

最新文章

  1. Linux TOP 交互命令
  2. hdu 1811 Rank of Tetris (并查集+拓扑排序)
  3. Spark RDD概念学习系列之RDD的重要内部属性(十五)
  4. java Lock 源码分析
  5. jQuery基础--样式篇(3)
  6. 不定高宽的元素居中的方法
  7. viper4android 魅族6,手机资讯导报:魅族自曝新旗舰PRO6摄像头不凸起
  8. redis与mysql一致性方案解析
  9. 理解createTrackbar函数
  10. 电信iptv机顶盒破解方法大全(图文教程)
  11. 三星q90 回音壁最新固件1010.5升级教程
  12. APP安全测试点概述
  13. 学习日记(三)利用Arduino读取加速度传感器信号并采用NRF24L01无线传输
  14. 二级路由添加网络打印机的方法
  15. 3.5寸TFT液晶屏验证板设计过程——硬件篇
  16. redis集群出现No reachable node in cluster
  17. 想设计亿万级高并发架构,你要先知道高并发是什么?(转载)
  18. python绘制决策树图片
  19. 厦门大学的【软件工程专业】被撤销!
  20. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E Maximum Flow

热门文章

  1. 生信学习学的是什么?常识!
  2. sql查看视图字段信息_高级(视图 索引)
  3. NOI数学之提高级:欧拉定理和欧拉函数
  4. 第45课 蝴蝶效应-动动脑 第2题 《小学生C++趣味编程》
  5. 1268:【例9.12】完全背包问题
  6. 好用的重装系统前使用的windows系统软件名称导出备份工具
  7. 白鹭引擎解决微信小游戏切换背景音乐无法播放的问题。
  8. 计算机网络课程设计之简单 Web Server 程序的设计与实现
  9. Linux基础学习七:mysql的安装和配置教程
  10. Web前端笔记-js中加载图片文件(vue cli中同样适用)