Python之面向对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之面向对象相关的知识,希望对你有一定的参考价值。
1》面向对象编程(Object-Oriented Programming):
对于编程语言的初学者而言,OOP不是一个很容易理解的编程方式,OPP的三大特性有继承,封装,多态,OOP也使得我们对代码的修改和扩展变得更容易;
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏;
继承:可以使用现有类的所有功能,并在无须重新编写原来的类的情况下对这些功能进行扩展;一般情况下,一个子类只能有一个基类,要实现多重继承, 可以通过多级继承来实现;继承概念的实现方式有三类:实现继承,接口继承和可视继承;
实现继承:使用基类的属性和方法而无需额外编码的能力;
接口继承:仅使用属性和方法的名称,但是子类必须提供实现的能力;
可视继承:子类使用基类的外观和实现代码的能力;
OOP开发范式大致为: 划分对象->抽象类->将类组织成为层次化结构(继承和合成)->用类与实例进行设计和实现;
多态:允许将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运行;简单的 说,允许将子类类型的指针赋值给父类类型的指针;
封装和继承是为了代码重用,而多态则是为了接口重用;
把一个抽象的类变成一个具体的对象的过程叫实例化;
1>类和构造方法:
2>类的变量与实例变量:
3>类的继承:
class SchoolMember(object):
membur_nums = 0
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
self.enroll()
def enroll(self):
SchoolMember.membur_nums +=1
# print("\\033[32:1m The [%s] memburs SchoolMember [%s] is enrolled!\\033[0m" %(self.membur_nums,self.name))
print("The [%s] memburs SchoolMember [%s] is enrolled!" % (self.membur_nums, self.name))
def tell(self):
print("Hello my name is %s" %self.name)
class Teacher(SchoolMember):
def __init__(self,name,age,sex,course,salary):
super(Teacher,self).__init__(name,age,sex)
self.course = course
self.salary = salary
def teaching(self):
print("Teacher [%s] is teaching [%s]" %(self.name,self.course))
class Student(SchoolMember):
def __init__(self,name,age,sex,course,tuition):
super(Student,self).__init__(name,age,sex)
self.course = course
self.tuition = tuition
def pay_tuition(self):
print("cao,student [%s] paying tuition [%s]" %(self.name,self.tuition))
t1 = Teacher("Alex",22,‘F‘,"PY",1000)
t2 = Teacher("Tenglan",25,‘N/A‘,"PY",900)
s1 = Student("SanJiang",24,"Female","python",15000)
s2 = Student("BaoAn",23,"F","python",5000)
t1.tell()
t1.teaching()
s1.tell()
s1.pay_tuition()
4>类的静态方法类方法及属性:
****python不支持多态并且也用不到多态,多态用于java和c#中;
多态的应用:
类的成员可以分为三大类:字段,方法和属性;
1)字段:字段包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,普通字段属于对象,静态 字段属于类,普通字段需要通过对象来访问,静态字段通过类访问;
静态字段在内存中只保存一份,普通字段在每个对象中都要保存一份;
静态字段===类变量,普通字段====实例变量;
2)属性(类方法):其中的装饰器将方法变为类方法,只能通过类来调用,实例不可以直接调用;
属性的基本使用:
类的静态方法:不能访问类变量,也不能访问实例变量;
类的属性,将方法变为属性:
给属性设置值:
删除属性的设置值:
4>新式类和经典类:
1)多继承:新式类用广度优先查找,经典类用深度优先查找(3.0中都是广度优先);
2)类的描述信息:__doc__;
3)类中实例销毁:__del__(析构函数),一直将程序执行完之后会执行实例销毁;
4)__dict__ 以字典形式遍历出类下的所有变量;
5>反射的妙用:
import sys
class WebServer(object):
def __init__(self,host,port):
self.host = host
self.port = port
def start(self):
print("Server is starting...")
def stop(self):
print("Server is stopping...")
def restart(self):
self.stop()
self.start()
def test_run(self,name):
print("running...",name,self.host)
if __name__ =="__main__":
server = WebServer(‘localhost‘,333)
#print(sys.argv[1])
if hasattr(server,sys.argv[1]):
func = getattr(server,sys.argv[1]) #获取server.start内存地址
func() #server.start()
# setattr(server,"run",test_run) #类的实例,属性,方法名
# server.run(server,"che")
# delattr(server,"host") #删除实例中的对象
# print(server.host)
delattr(WebServer,"start") #删除类中的方法
print(server.restart())
# cmd_dic = {
# "start":server.start,
# "stop":server.stop,
# "restart":server.restart,
# }
#if sys.argv[1] == "start":
# if sys.argv[1] in cmd_dic:
# cmd_dic[sys.argv[1]]()
以上是关于Python之面向对象的主要内容,如果未能解决你的问题,请参考以下文章