面向对象介绍
世界万物,皆可分类 世界万物,皆为对象 只要是对象,就有属性 只要是对象,就有分类
特性
类 class
一个类即是对一类拥有相同属性的对象的抽象蓝图、原型。 在类中定义了这些对象都具备的属性
对象 object
一个对象即是一个类的实例化后的实例,是个抽象的东西,一个类必须经过实例化后方可在程序中使用 一个类可以实例化多个对象,每个对象可以有自己不同的属性
封装 encapsulation
在类中对数据的赋值、内部调用对外部用户都是透明的,这类变成了一个胶囊或容器,里面包含着类的属性和方法 内部的功能都封装了,外部无法访问 就是私有函数 __ 来实现的一种方法
举例
上下两种方法的区别在哪里,有什么弊端,有什么优势? class dog: def __init__(self,name): self.name = name def bulk(self): print ("%s wang wang"% self.name) d1 = dog("d1") d1.bulk()
class dog: def __init__(self): pass def bulk(self,name): print ("%s wang wang "%name) d3 = dog() d3.bulk("dog_3") d4 = dog() d4.bulk("dog_4")
构造函数__init__
__init__方法的第一个参数永远是slef,表示创建实例本身,因此,在__init__方法内部,可以把各种
属性绑定到self,因为self指向创建实例的本身
#用于在实例化的时候做一些初始化的工作
#类名
class cs: n = 123 #类变量 #先找实例变量,没有实例变量找类变量 def __init__(self,name,role,wapon,life=100,money=15000): #构造函数,用来对类的做初始化的工作 self.name = name #实例变量(静态属性),作用域就是本身 self.role = role self.wapon = wapon self.life = life self.money = money def person(self): #类的方法,功能(动态属性) print ("%s"%self.role,self.name) role_1 = cs("king","police","ak") #生成一个实例 role_1.add_attrbute = "100" #增加属性 role_1.name = "renmae lisi" #修改属性 del r1.weapon #删除属性 print (role_1.add_attrbute,role_1.name,role_1.wapon(会提示没有这个属性))
class Role: name = "out_ini_" name_list = [] def __init__(self,name,age=None): self.name = name self.age = age def test(self): print (self.name) print (self.age) r1 = Role("zhangsan","20") r1.name_list.append("from r1") r2 = Role("lisi","50") r2.name_list.append("from r2") print (r2.name_list,r1.name_list) #打印 因为str和tuple是不可变变量,list和dict是可变变量 ['from r1', 'from r2'] ['from r1', 'from r2']
语法
属性
增
删
改
tuple,list与str的区别
方法
问 : 类变量的用途? 答 : 大家公用的属性
举例
class person(name,age,addr) ch = "中国" def __init__(self,name,age,addr): self.name = name p1 = person(name,age,addr)
析构函数
在实例释放、销毁的时候执行的,通常用于做一些结尾和收尾工作,不用调用最后执行 如关闭一些数据库连接,打开的临时文件 #在对象释放或销毁的时候自动执行,删除实例化 def __del__(self): print ("%s 彻底销毁..")%"ssss"
私有方法、私有属性
私有属性:
def __init__(self,name): self.__name__ = name #私有属性 def show_Status(self): print (%nself.__ame) r1.showstatus() #只有在def里才能改,要使用的话需要先定一个调用私有方法的函数,需要才能调用
私有方法:
只能在内部调用,不能在类外部调用 class Person: def __init__(self,name): self.name = name print (self.name) def __work(self,salary): #定义私有方法 print ("%s salary is: %d"%(self.name,salary)) def worker(self): self.__work(500) #在内部调用,外部的话会找不到私有方法 if __name__=="__main__": officer = Person("Tom") officer.worker()
继承 Inheritance
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
子类可以继承父类
子类之间不能直接调用
class people: def __init__(self,name,age=10): self.name = name self.age = age def eat(self): print ("%s is eating..."%self.name) def sleep(self): print ("%s is sleeping.."%self.name) def talk(self): print ("%s is talking.."%self.name) class man(people): #继承people的类 pass m_1 = man("TOM") #直接调用 m_1.eat()
修改父类方法
class people: def __init__(self,name,age=10): self.name = name self.age = age def eat(self): print ("%s is eating..."%self.name) def sleep(self): print ("%s is sleeping.."%self.name) def talk(self): print ("%s is talking.."%self.name) class man(people): def piao(self): print ("%s is piao ..."%self.name) def modify_function(self): people.sleep(self) #修改父类 print ("modify...father function..%s"%self.name) m1 = man("tom") #继承父类,没有初始化,都继承过来 m1.piao() m1.modify_function() #修改父类的方法
子类增加初始化构造函数
class people: def __init__(self,name,age=10): self.name = name self.age = age def eat(self): print ("%s is eating..."%self.name) def sleep(self): print ("%s is sleeping.."%self.name) def talk(self): print ("%s is talking.."%self.name) class man(people): def __init__(self,name,age,money) #沿用父类的属性,并加上自己的新属性 people.__init__(self,name,age) #调用父类的构造函数,自己再增加一个moeny的属性 #super(man,woman,self).__init__(name,age) #另一种重构造父类方法,只是不用再修改父类调用的people这个名字,还支持多继承 self.money = moeny print "money" def piao(self): print ("%s is piao ..."%self.name) def modify_function(self): people.sleep(self) print ("modify...father function..%s"%self.name) m1 = man("tom") m1.piao() m1.modify_function()
区别主要提现在多继承顺心上(多继承)
python3 经典类和新势类 广度优先
python2 经典类 是深度优先
python2 新势类 是广度优先
经典类
class people: def __init__(self): pass
新势类
class people(object): def__init__(self): pass
多继承
class people(object): def __init__(self,name): self.name = name class relation(object): def make_friends(self,obj): print ("%s make friends %s"%(self.name,obj.name)) class man(people,relation): def run(self): print (self.name) m1 = man("tom") m2 = man("jack") m1.make_friends(m2) tom make friends jack..
多态 Polymorphism
简单说 : 一个统一接口多个实现 主要作用就是实现接口的重用 举例 销售是一个类 技术是一个类 行政是一个类 例如老板说9点开始工作,员工都开始工作,那么不需要分别对销售部说工作、对技术部、行政部也去说工作 这样的话,只要调用员工类中的工作属性就可以实现全员工作
class animal: def __init__(self,name): self.name = name @staticmethod def animal(obj) obj.talk() class cat(animal): def talk(self) print (" meow ") class dog(animal): def talk(self) print (" wow wow ") c = cat("jack") d = dog("tom") Animal.animal.talk(c) Animal.animal.talk(d)