博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python类及其方法
阅读量:5281 次
发布时间:2019-06-14

本文共 7761 字,大约阅读时间需要 25 分钟。

 

一、介绍

在 Python 中,面向对象编程主要有两个主题,就是类和类实例

类与实例:
类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象
的具体信息。

类有这样一些的优点:

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

二、类的定义

1.定义类(class)的语法

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

一第行,语法是class 后面紧接着,类的名字,最后别忘记“冒号”,这样来定义一个类。

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

2.初始化对象

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

1 >>> class peo:2 ...     def __init__(self,name,age,sex):3 ...             self.Name = name4 ...             self.Age = age5 ...             self.Sex = sex6 ...     def speak(self):7 ...             print "my name" + self.Name8 ...

实例化这个类的对象时:

1 >>> zhangsan=peo("zhangsan",24,'man')2 >>> print zhangsan.Age3 244 >>> print zhangsan.Name5 zhangsan6 >>> print zhangsan.Sex7 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(),写成这样之后它就是类的一个实例了。

1 class info(object): 2  3   @classmethod 4   def sayclassmethod(cls): 5  6     print 'say %s' % cls 7  8   def saymethod(self): 9 10     print 'say %s' % self11 12 13 test = info()14 test.saymethod()##实例调用方法15 test.sayclassmethod()##实例调用类方法16 info.saymethod(test)##类调用实例方法17 info.sayclassmethod()##类调用类方法

大家对比运行下。

 

5.类的装饰器@property

1 class Pager: 2     def __init__(self,all_count): 3         self.all_count=all_count 4     @property 5     def all_pager(self): 6         a,b=divmod(self.all_count,10) 7         if a==0: 8             return a 9         else:10             return  a+111 12     @all_pager.setter13     def all_pager(self,value):14         print(value)15 16     @all_pager.deleter17     def all_pager(self):18         print('hehe')19 p=Pager(101)20 ret=p.all_count#以访问类属性的方法访问对象的方法21 print(ret)

下面看第二种方法

1 class Pager: 2     def __init__(self,all_count): 3         self.all_count=all_count 4     def f1(self): 5         return 123 6     def f2(self,value): 7         print('======') 8     def f3(self): 9         print('+++++++')10 11     foo=property(fget=f1,fset=f2,fdel=f3)12 p=Pager(101)13 ret=p.foo14 p.foo='alex'15 print(p.foo)16 del p.foo

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

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

 

 

三、继承类定义:

1.单继承

class <类名>(父类名)

<语句>

1 class childbook(book)2     age = 10

#单继承示例

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

 

2.类的多重继承

class 类名(父类1,父类2,....,父类n)
<语句1>

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

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

1 class speaker():  2     topic = ''  3     name = ''  4     def __init__(self,n,t):  5         self.name = n  6         self.topic = t  7     def speak(self):  8         print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic))

#多重继承  

1 class sample(speaker,student):  2     a =''  3     def __init__(self,n,a,w,g,t):  4         student.__init__(self,n,a,w,g)  5         speaker.__init__(self,n,t)  6 7 test = sample("Tim",25,80,4,"Python")  8 test.speak()#方法名同,默认调用的是在括号中排前地父类的方法

 

 

四、类的专业方法

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

1 __init__

类似于构造函数

1 #!/usr/local/bin/python2 class Study:3         def __init__(self,name=None):4                 self.name = name5         def say(self):6                 print self.name7 study = Study("Badboy")8 study.say()

2 __del__

类似于析构函数

1 #!/usr/local/bin/python 2 class Study: 3         def __init__(self,name=None): 4                 self.name = name 5         def __del__(self): 6                 print "Iamaway,baby!" 7         def say(self): 8                 print self.name 9 study = Study("zhuzhengjun")10 study.say()

3__repr__

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

1 #!/usr/local/bin/python 2 class Study: 3         def __init__(self,name=None): 4                 self.name = name 5         def __del__(self): 6                 print "Iamaway,baby!" 7         def say(self): 8                 print self.name 9         def __repr__(self):10                 return "Study('jacky')"11 study = Study("zhuzhengjun")12 study.say()13 print type(repr(Study("zhuzhengjun"))) # str14 print type(eval(repr(Study("zhuzhengjun")))) # instance15 16 study = eval(repr(Study("zhuzhengjun")))17 18 study.say()

4__str__

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

print objectOfClass

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

1 #!/usr/local/bin/python 2  3 class PhoneNumber: 4         def __init__(self,number): 5                  self.areaCode=number[1:4] 6                  self.exchange=number[6:9] 7                  self.line=number[10:14] 8  9         def __str__(self):10                 return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)11 12 def test():13          newNumber=raw_input("Enter phone number in the form. (123) 456-7890: \n")14          phone=PhoneNumber(newNumber)15          print "The phone number is:"16          print phone17 18 if__name__=="__main__":19          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 一样,它只是重定向到字典,返回字典的值。

1 class Zoo:   2      def __getitem__(self, key):   3          if key == 'dog':return 'dog'   4          elif key == 'pig':return  'pig'   5          elif key == 'wolf':return 'wolf'   6          else:return 'unknown'   7     8 zoo = Zoo()   9 print zoo['dog']  10 print zoo['pig']  11 print zoo['wolf']

打印 dog pig wolf

7__setitem__

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

1 class Zoo:   2      def __setitem__(self, key, value):   3          print 'key=%s,value=%s' % (key, value)   4     5 zoo = Zoo()   6 zoo['a'] = 'a'   7 zoo['b'] = 'b'   8 zoo['c'] = 'c' 9 打印:10 key=a,value=a11 key=b,value=b12 key=c,value=c

8 __delitem__

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

1 class A:  2      def __delitem__(self, key):  3          print 'delete item:%s' %key  4    5 a = A()  6 del a['key']

转载于:https://www.cnblogs.com/aibabel/p/11030986.html

你可能感兴趣的文章
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
SWIFT国际资金清算系统
查看>>
站立会议第四天
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
hdu 3938 并查集
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>