Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

python类及其方法

$
0
0

python类及其方法

一、介绍

在 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 = name
4 ... self.Age = age
5 ... self.Sex = sex
6 ... def speak(self):
7 ... print "my name" + self.Name
8 ...

实例化这个类的对象时:


1 >>> zhangsan=peo("zhangsan",24,'man')
2 >>> print zhangsan.Age
3 24
4 >>> print zhangsan.Name
5 zhangsan
6 >>> print zhangsan.Sex
7 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' % self
11
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+1
11
12 @all_pager.setter
13 def all_pager(self,value):
14 print(value)
15
16 @all_pager.deleter
17 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.foo
14 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/python
2 class Study:
3 def __init__(self,name=None):
4 self.name = name
5 def say(self):
6 print self.name
7 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"))) # str
14 print type(eval(repr(Study("zhuzhengjun")))) # instance
15
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

Viewing all articles
Browse latest Browse all 9596

Trending Articles