缺点:可扩展性差python
应用场景:用户需求常常变化,互联网应用,游戏,企业内部应用sql
stu1 = LufftStudent() print(stu1.__dict__)
类:编程
class LuffyStudent: school = 'luffycity' #数据属性 def learn(self):# 函数属性 print('is learing') def eat(self): print('is eating') stu1 = LuffyStudent() #实例化对象 # # 查看类的名称空间 # print(LuffyStudent.__dict__) # print(LuffyStudent.__dict__['school']) # print(LuffyStudent.__dict__['learn']) # 查看类的属性 #print(LuffyStudent.school) #LuffyStudent.__dict__['school'] # 增长类的属性 LuffyStudent.county = 'China' # 删除 del LuffyStudent.county # 改 LuffyStudent.school = 'Luffycity'
class LuffyStudent: school = 'luffycity' #数据属性 def __init__(self,name,sex,age):# __init__方法用来对象定制对象独有的特征 self.Name = name self.Sex = sex self.Age = age def learn(self):# 函数属性 print('is learing') def eat(self): print('is eating') # 后产生的对象 stu1 = LuffyStudent('wualin','man',29)#LuffyStudent.__init__(stu1,'wualin','man',20) # 加上__init__方法后,实例化步骤 # 1. 先产生一个空对象stu1 # 2. 触发LuffyStudent.__init__(stu1,'wualin','man',29) # # # 查 # print(stu1.Name) # print(stu1.Sex) # print(stu1.Age) # # 改 # stu1.Name='520' # # # 删除 # del stu1.Name # # # 增 # stu1.class_name = 'python开发'
类中的数据属性:是全部对象共有的函数
class LuffyStudent: school = 'luffycity' #数据属性 def __init__(self,name,sex,age):# __init__方法用来对象定制对象独有的特征 self.Name = name self.Sex = sex self.Age = age def learn(self):# 函数属性 print('is learing') def eat(self): print('is eating') # 后产生的对象 stu1 = LuffyStudent('wualin','man',29) stu2 = LuffyStudent('张宝宝','man',19) # 类的数据属性 print(stu1.school) # 类的函数属性,类中函数属性是给对象使用的,谁调用就绑定给它使用,自动将对象传入第一个参数 stu1.learn()#learn(stu1) #对象在访问一个属性的时候会先在对象里面的名称空间找,若是对象里面没有则去类里面找。不会到全局变量里面找
class Girlun: faction = 'Demasia' def __init__(self,name,life,attack): self.name = name self.life = life self.attack = attack def attack_1(self,enemy): enemy.life = enemy.life-self.attack print('%s攻击了%s'%(self.name,enemy.name)) class Riwen: faction = 'Demasia' def __init__(self, name, life, attack): self.name = name self.life = life self.attack = attack def attack_1(self, enemy): enemy.life = enemy.life - self.attack print('%s攻击了%s' % (self.name, enemy.name)) g1 = Girlun('草丛伦',100,10) r1 = Riwen('锐萌萌',80,20) print(r1.life) g1.attack_1(r1) print(r1.life)
print(<类名>.__bases__)
class Hero: def __init__(self,name,life,attack): self.name = name self.life = life self.attack = attack def attack_1(self,enemy): print('%s攻击了%s'%(self.name,enemy.name)) class Griren(Hero): pass class Riven(Hero): pass g1 = Griren('盖伦',80,50) r1 = Riven('锐雯',50,50) g1.attack_1(r1)
print(<类名>.__mro__
class Hero: def __init__(self,name,life,attack): self.name = name self.life = life self.attack = attack def attack_1(self,enemy): enemy.life -=self.attack class Griren(Hero): def attack_1(self,enemy): Hero.attack_1(self,enemy) # 不依赖于继承 print('%s攻击了%s'%(self.name,enemy.name)) class Riven(Hero): pass g1 = Griren('盖伦',80,50) r1 = Riven('锐雯',100,50) print(r1.life) g1.attack_1(r1) print(r1.life)
class Hero: def __init__(self,name,life,attack): self.name = name self.life = life self.attack = attack def attack_1(self,enemy): enemy.life -=self.attack class Griren(Hero): def __init__(self,name,life,attack,weapon): super().__init__(name,life,attack)# 第一种写法,依赖于继承 def attack_1(self,enemy): super(Griren,self).attack_1(enemy)# 第二种写法,依赖于继承 print('%s攻击了%s'%(self.name,enemy.name)) class Riven(Hero): pass g1 = Griren('盖伦',80,50,'大保健') r1 = Riven('锐雯',100,50) print(r1.life) g1.attack_1(r1) print(r1.life) print(g1.__dict__)
import abc class Animal(metaclass=abc.ABCMeta):# 经过抽象类使子类中的方法名统一块儿来 @abc.abstractmethod def run(self): pass @abc.abstractmethod def eat(self): pass class People(Animal): def run(self): pass def eat(self): pass class Pig(Animal): def run(self): pass def eat(self): pass
同一种事物的多种形态工具
class A: __x = 1 #_A__x=1 def __init__(self,name): self.__name=name def __foo(self): print('run foo')
封装数据属性:明确区份内外,控制外部对隐藏的属性的操做行为code
封装方法:隔离复杂度对象
propert:特性继承
class People: def __init__(self,name): self.__name = name @property def name(self): return self.__name @name.setter def name(self,val): if not isinstance(val,str): print('val is not str') return self.__name = val @name.deleter def name(self): print('不容许删除') p = People('wualin') print(p.name)
绑定到对象的方法:在类内定义的没有被任务装饰器修饰的接口
绑定到类的方法:在类内部定义的装饰器classmethod修饰的方法游戏
class Foo: def __init__(self,name): self.name = name def tell(self):# 绑定到对象的函数 print('name:%s'%self.name) @classmethod def func(cls): #cls=Foo 绑定到类的方法 print(cls) @staticmethod def func1(x,y):#类中的普通函数 print(x+y) f = Foo('wualin') Foo.func1(1,2) f.func1(1,3)
hasattr(obj,'name')# 判断对象有没有'name'属性 obj.__dict__['name'] getattr(obj,'name') # 拿到对象的属性 setattr(obj,'name','wualin')#修改 obj.name = 'wualin' delattr(obj,'age')# del obj.age 以上方法一样适用于类
class Service: def run(self): while True: cmd = input('>>>:').strip() if hasattr(self,cmd): func = getattr(self,cmd) func() def get(self): print('get...') def put(self): print('put...') obj = Service() obj.run()
class Foo(object): psss obj = Foo() isinstance(obj,Foo)
class Foo(): pass class Bar(Foo): pass issubclass(Bar,Foo)
# item class Foo(): def __init__(self,name): self.name = name def __getitem__(self, item):#查看 return self.__dict__.get(item) def __setitem__(self, key, value):#增长 self.__dict__[key] = value def __delitem__(self, key):#删除 del self.__dict__[key] obj = Foo('wualin') #操做字典的方式去操做obj对象 #查看 print(obj['name']) #obj.name #增长 obj['age'] = 20 #obj.age = 20 print(obj['age']) #删除 del obj['name'] #del obj.name
class Foo(): def __init__(self,name,age): self.name = name self.age = age def __str__(self): return '<name:%s age:%s>'%(self.name,self.age) f = Foo('wualin',20) print(f)
class Open(): def __init__(self,filename): print('Open...') def __del__(self): print('del...') f = Open('a.txt') print('---main---')
class Foo: def __call___(self,*args,**kwargs) print(self) print(args) print(kwargs) obj = () obj(1,2,3,a=1,b=2,c=3)#obj.__call__(obj,1,2,3,a=1,b=2,c=3)
方式1:class
class_name = 'Chinese' #类名 class_bases = (object,) #类的基类 class_body = ''' country = 'china' def __init__(self,name,age): self.name = name self.age = age def talk(self) print('%s is talking'$self.name) ''' class_dic = {}# 类的局部名称空间 exec(class_body,globals(),class_dic) Chinese1 = type(class_name,class_bases,clsaa_dic)
class Mymeta(type): ''' 给传入class_name添加首字母必须大写,不然抛出异常,若是定义类的元类是Mymeta(metaclass=),就必须遵循自定义规则 ''' def __init__(self,class_name,class_bases,class_dic): if not class_name.istitle(): raise TypeError('首字母大写') #raise主动抛出错误 class Chinese(object,metaclass=Mymeta): def __init__(self,name,age): self.name = name self.age = age def tall_info(self): print('Name: %s Age: %s'%(self.name,self.age))
class Mymeta(type): def __call__(self, *args, **kwargs): ''' 实例化类的步骤: 1. 生成obj对象 2. 初始化obj对象 3. 返回obj :param args: :param kwargs: :return: ''' obj = object.__new__(self) self.__init__(obj,*args,*kwargs) return obj class Chinese(object,metaclass=Mymeta): def __init__(self,name,age): self.name = name self.age = age def tall_info(self): print('Name: %s Age: %s'%(self.name,self.age)) obj = Chinese('WUALIN',20) print(obj.__dict__)
class MySQL: ''' 假如一个类初始化属性都是同样的,能够使用单例模式节省内存空间 ''' __instance = None def __init__(self): self.host = '127.0.0.1' self.port = 3306 @classmethod def singleton(cls): #单例模式函数,生成实例化对象时调用该函数 if not cls.__instance: obj=cls() cls.__instance=obj return cls.__instance # 两次实例化对象内存地址是同样的 obj1 = MySQL.singleton() obj2 = MySQL.singleton()
class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): if '__doc__' not in class_dic or not class_dic['__doc__'].strip(): raise TypeError('注释不能为空') super(Mymeta,self).__init__(class_name,class_bases,class_dic) self.__instance = None def __call__(self, *args, **kwargs): if not self.__instance: obj = object.__new__(self) self.__init__(obj) self.__instance = obj return self.__instance class Mysql(object,metaclass=Mymeta): ''' xxx ''' def __init__(self): self.host = '127.0.0.1' self.port = 3306 obj1 = Mysql() obj2 = Mysql() print(obj1 is obj2)