首页 > 代码库 > 7.面向对象编程高级
7.面向对象编程高级
什么是类和对象
class Garen: camp=‘Demacia‘ def __init__(self,nickname,aggresivity,life_value): self.nickname=nickname self.aggresivity=aggresivity self.life_value=life_value def attack(self,enemy): print(‘is attacting‘) #类的第一个功能:实例化 g1=Garen(‘草丛伦‘,82,100) #类的的第二个功能:属性引用,包含数据属性和函数属性 g1.attack(2222) #对于一个实例来说,只有一个功能:属性引用,实例本身只拥有数据属性 print(g1.nickname) print(g1.aggresivity) print(g1.life_value)
接口与归一化设计
#接口的概念,父类只写名字,不写实现 class ALLFile: #接口类 def read(self): #接口函数 pass def write(self): pass class Text(ALLFile): #子类继承父类 def read(self): print(‘text read‘) def write(self): print(‘text write‘) class Sata(ALLFile): #子类继承父类 def read(self): print(‘sata read‘) def write(self): print(‘sata write‘) t=Text() s=Sata() t.read() t.write() s.read() s.write()
抽象类
import abc class ALLFile(metaclass=abc.ABCMeta): #抽象类 @abc.abstractmethod #加这个装饰器的必须在子类中实现 def read(self): # pass @abc.abstractmethod #加这个装饰器的必须在子类中实现 def write(self): pass def test(self):#可以不被实现 print(‘22222222‘) class Text(ALLFile): #子类中必须实现父类中规定的两个方法 def read(self):pass def write(self):pass t1=Text() t1.test() # 抽象类不能被实例化, # a=ALLFile()
反射
class Foo: def __init__(self,name): self.name=name def func(self): print(‘func‘) f = Foo(‘egon‘) print(Foo.__dict__) print(f.__dict__) #hasattr判断类中是否有这个func的名字 print(hasattr(Foo,‘func‘)) #判断实例中是否有x这个属性 print(hasattr(f,‘x‘)) f.x=1 #根据字符串,调用实例中的属性 print(getattr(f,‘x‘)) #常用组合 if hasattr(f,‘func‘): getattr(f,‘func‘)() #调用,如果没有,返回None print(getattr(f,‘y‘,None)) #设置一个属性 #f.y=1 setattr(f,‘y‘,1)
属性方法:
class A: def __init__(self,name): self.__name=name @property #将这个类中的方法,变成一个类中的属性,可以通过.name调用 def name(self): return self.__name #当调用.name时返回的是__self.name @name.setter #赋值操作调用,当为.name赋值时调用 def name(self,value): # print(‘------‘) if not isinstance(value,str): #判断赋值的是不是字符 raise TypeError(‘%s must be str‘%value)#抛出异常 self.__name=value @name.deleter #删除.name属性时调用 def name(self): print(‘=====‘) del self.__name a=A(‘ennn‘) print(a.name) a.name=‘ssa‘ print(a.name) del a.name
继承
class A: #默认继承object pass class B(A):#继承A pass #打印继承的父类 print(B.__bases__) #继承了 print(A.__bases__) # #新式的类 class Animal: start=‘earth‘ def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender def run(self): print(‘running‘) def talk(self): print(‘talking‘) class People(Animal): pass def piao(self): print(‘大保健‘) class Pig(Animal): pass p1=People(‘alex‘,50,‘F‘) pig1=Pig(‘贺磊‘,250,‘22‘) print(p1.start) p1.run()
#继承可以重用代码 class Hero: def __init__(self,nickname,aggresivity,life_value): self.nickname=nickname self.aggresivity=aggresivity self.life_value=life_value def attack(self,enemy): print(‘is attacting‘,enemy.nickname) enemy.life_value-=self.aggresivity class Garen(Hero): camp=‘Demacia‘ class Riven(Hero): camp=‘Noxus‘
子类继承父类的方法:super()
class People(object): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class Teacher(People): def __init__(self,name,age,sex,level): #People.__init__(name,age,sex) #需要知道父类的名字~ super().__init__(name,age,sex) #推荐用法 self.level=level t1=Teacher(‘alex‘,22,‘m‘,‘高级‘) print(t1.name)
静态方法
@staticmethod
静态方法不属于实例,也不属于类
与类只是名义上的归属关系
@classmethod
类方法
只能访问类变量,不能访问实例变量
import time class Date: def __init__(self,year,month,day): self.year=year self.month=month self.day=day @staticmethod #静态方法 def now(): t=time.localtime() return Date(t.tm_year,t.tm_mon,t.tm_mday) ‘‘‘打印: <__main__.Date object at 0x0000022298A754A8>‘‘‘ @classmethod #改成类方法 def class_now(cls): t=time.localtime() return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化 ‘‘‘ 输出结果: year:2017 month:3 day:3 ‘‘‘ class EuroDate(Date): def __str__(self): return ‘year:%s month:%s day:%s‘ %(self.year,self.month,self.day) e=EuroDate.now() print(e) #我们的意图是想触发EuroDate.__str__,此时e就是由EuroDate产生的,所以会如我们所愿 print(EuroDate.class_now()) print(Date.now())
面向对象高级使用
class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print(‘del obj[key]时,我执行‘) self.__dict__.pop(key) def __delattr__(self, item): print(‘del obj.key时,我执行‘) self.__dict__.pop(item) f=Foo(‘egon‘) print(f[‘name‘]) f[‘x‘]=1 print(f.__dict__) del f.x #del f[‘x‘]
7.面向对象编程高级
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。