python编程进阶之类和对象用法实例分析
本文实例讲述了python类和对象用法。分享给大家供大家参考,具体如下:
前面我们都是用python面向过程编程,现在来用python创建类和对象,面向对象编程。类和对象是面向对象编程的两个主要方面。类创建一个新类型,而对象这个类的实例。这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象)。在python中,类和实例中的变量称为域,类和实例中的函数称为方法,域和方法都是类和实例的属性。
类的定义
在定义类或者它的函数的时候,如果没有参数的话,需要把参数写为self,这样在外部调用的时候能清楚调用的是哪个实例的函数。这个self表示的是当前的实例,与C++中的self和Java中的this是一样的。
空类
#!/usr/bin/python #Filename:simplestclass.py classPerson: pass#Anemptyblock p=Person() printp
我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。这样编译的时候就会跳过。这是一个空类。
接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。因为这个类不需要任何的参数,所以创建的时候也不需要参数。
$pythonsimplestclass.py
<__main__.Personinstanceat0xf6fcb18c>
打印这个对象,我们可以看到这个对象所属的类,以及它的内存地址。
__init__函数
在上面的例子中,我们没有写任何东西,但是还是会有一个默认的构造函数。在python中也有类似构造函数的东西,就是__init__函数。在创建对象的时候会自动调用这个函数。
#!/usr/bin/python
#Filename:class_init.py
classPerson:
def__init__(self,name):
self.name=name
defsayHi(self):
print'Hello,mynameis',self.name
p=Person('Swaroop')
p.sayHi()
输出:
$pythonclass_init.py
Hello,mynameisSwaroop
当新建一个person对象时,因为__init__中需要有name参数,所以需要提供一个参数。可以看到这个类中有一个自己的域,在构造的时候把name的值赋给对象里的name。
可以看到,sayHi并不需要参数,但是在定义函数时仍然要有参数self。
__del__函数
就如同init方法一样,还有一个特殊的方法del,它在对象消逝的时候被调用。相当于析构函数。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。但是很难保证这个方法究竟在什么时候运行。如果你想要指明它的运行,你就得使用del语句。代码例子和下面的在一起。
使用类的变量
Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的。
只有一个例外:如果你使用的数据成员名称以双下划线前缀比如__privatevar,Python的名称管理体系会有效地把它作为私有变量。
这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前缀。而其他的名称都将作为公共的,可以被其他类/对象使用。
#!/usr/bin/python
#Filename:objvar.py
classPerson:
'''Representsaperson.'''
population=0
def__init__(self,name):
'''Initializestheperson'sdata.'''
self.name=name
print'(Initializing%s)'%self.name
#Whenthispersoniscreated,he/she
#addstothepopulation
Person.population+=1
def__del__(self):
'''Iamdying.'''
print'%ssaysbye.'%self.name
Person.population-=1
ifPerson.population==0:
print'Iamthelastone.'
else:
print'Therearestill%dpeopleleft.'%Person.population
defsayHi(self):
'''Greetingbytheperson.
Really,that'sallitdoes.'''
print'Hi,mynameis%s.'%self.name
defhowMany(self):
'''Printsthecurrentpopulation.'''
ifPerson.population==1:
print'Thereisnobodyhere.'
else:
print'Wehave%dpersonshere.'%Person.population
swaroop=Person('Swaroop')
swaroop.sayHi()
swaroop.howMany()
kalam=Person('AbdulKalam')
kalam.sayHi()
kalam.howMany()
swaroop.sayHi()
swaroop.howMany()
输出:
$pythonobjvar.py
(InitializingSwaroop)
Hi,mynameisSwaroop.
Iamtheonlypersonhere.
(InitializingAbdulKalam)
Hi,mynameisAbdulKalam.
Wehave2personshere.
Hi,mynameisSwaroop.
Wehave2personshere.
AbdulKalamsaysbye.
Therearestill1peopleleft.
Swaroopsaysbye.
Thereisnobodyhere.
这是一个很长的例子。这里,population属于Person类,因此是一个类的变量。name变量属于对象(它使用self赋值)因此是对象的变量。
观察可以发现init方法用一个名字来初始化Person实例。在这个方法中,我们让population增加1,这是因为我们增加了一个人。同样可以发现,self.name的值根据每个对象指定,这表明了它作为对象的变量的本质。
记住,你只能使用self变量来引用同一个对象的变量和方法。这被称为属性引用。
当一个对象被清除的时候,del被调用,人数减少1并输出谁走了。一开始AbdulKalam被自动清除了,后来Swaroop也被自动清除了。清除的顺序应该跟对象闲置的时间有关,当闲置时间达到某个值就清除掉。
继承
python的继承和C++还有JAVA没有什么不同,就是构造函数和其他函数里记得要在参数里加上self。函数的重载也是和C++,JAVA一样的。
例子:
#!/usr/bin/python
#Filename:inherit.py
classSchoolMember:
'''Representsanyschoolmember.'''
def__init__(self,name,age):
self.name=name
self.age=age
print'(InitializedSchoolMember:%s)'%self.name
deftell(self):
'''Tellmydetails.'''
print'Name:"%s"Age:"%s"'%(self.name,self.age),
classTeacher(SchoolMember):
'''Representsateacher.'''
def__init__(self,name,age,salary):
SchoolMember.__init__(self,name,age)
self.salary=salary
print'(InitializedTeacher:%s)'%self.name
deftell(self):
SchoolMember.tell(self)
print'Salary:"%d"'%self.salary
classStudent(SchoolMember):
'''Representsastudent.'''
def__init__(self,name,age,marks):
SchoolMember.__init__(self,name,age)
self.marks=marks
print'(InitializedStudent:%s)'%self.name
deftell(self):
SchoolMember.tell(self)
print'Marks:"%d"'%self.marks
t=Teacher('Mrs.Shrividya',40,30000)
s=Student('Swaroop',22,75)
print#printsablankline
members=[t,s]
formemberinmembers:
member.tell()#worksforbothTeachersandStudents
输出:
$pythoninherit.py
(InitializedSchoolMember:Mrs.Shrividya)
(InitializedTeacher:Mrs.Shrividya)
(InitializedSchoolMember:Swaroop)
(InitializedStudent:Swaroop)Name:"Mrs.Shrividya"Age:"40"Salary:"30000"
Name:"Swaroop"Age:"22"Marks:"75"
schoolmenber是父类,学生和老师是子类,继承的方法为在类定义中把参数设为schoolmenber。可以看到,当我们继承一个类的时候,首先调用的是父类的构造函数,然后才是子类的。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。