Spring aware接口的作用是什么
235
2022-08-27
Python ❀ 面向对象(二)
Python学习计划(十)
面向对象(二)
一、单继承 在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物。
#定义一个父类,如下:
class Cat(object): def_init_(self,name,color='白色'): self.name = name self.color = color def run(self): print("%s---再跑"%self.name)
#定义一个子类,继承Cat类如下:
class Bosi(Cat): def setNewName(self,newName): self.name = newName def eat(self): print("%s---在吃"%self.name)bs = Bosi("印度猫")print('bs的名字为:%s'%bs.name)print('bs的颜色为:%s'%bs.color)bs.eat()bs.setNewName('波斯')bs.run()
虽然子类没有定义_init_方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认指向了那个继承过来的_init_方法。
子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类私有的属性,不能通过对象直接访问,但是可以通过方法访问私有的方法,不能通过对象直接访问私有的属性、方法,不会被子类继承,也不能被访问
一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用。
二、重写父类方法与调用父类方法 1、重写父类方法: 所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
class Cat(object): def sayHello(self): print("hello---1")class Bosi(Cat): def sayHello(self): print("hello---2")bosi = Bosi()bosi.sayHello()
2、调用父类方法:
class Cat(object): def _init_(self,name): self.name = name self.color = 'yellow'class Bosi(Cat): def _init_(self,name): #调用父类的_init_方法1(python2) #Cat._init_(self,name) #调用父类的_init_方法2 #supper(Bosi,self)._init_(name) #调用父类的_init_方法3 supper()._init_(name) def getName(self): return self.name bosi = Bosi('xiaohua') print(bosi.name) print(bosi .color)
三、多态 定义时的类型和运行时的类型不一样,此时就称为多态 表现为,子类对象指向父类引用
class F1(object): def show(self): print('F1.show')class S1(F1): def show(self): print('S1.show')class S2(F1): def show(self): print('S2.show')def Func(obj): obj.show()s1_obj = S1()Func(s1_obj)s2_obj = S2()Func(s2_obj)
四、类属性与实例属性 1、类属性: 类属性就是类所拥有的属性,它被所有类的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类和实例对象访问
class People(object): name = 'Tom' #公有的类属性 _age = 12 #私有的类属性p = People()print(p.name) #正确print(People.name) #正确print(p._age) #错误,不能在类外通过实例对象访问私有的类属性print(People._age) #错误,不能再类外通过类对象访问私有的类属性
2、实例属性(对象属性): 每个对象独有的属性,值可以一样也可以不一样,提现生物多样性
class People(object): address = '山东' #类属性 def _init_(self): self.name = 'xiaowang' #实例属性 self.age = 20 #实例属性p = People()p.age = 12 #实例属性print(p.address) #正确print(p.name) #正确print(p.age) #正确print(People.address) #正确print(People.name) #错误print(People.age) #错误
3、通过实例对象修改类属性:
class People(object): country = 'china' #类属性print(People.country)p = People()print(p.country)p.country = 'japan'print(p.country) #实例属性会屏蔽掉同名的类属性print(People.country)del p.country #删除实例属性print(p.country)
如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实现属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
五、静态方法与类方法 1、类方法: 是类所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。
class People(object): country = 'china' #类方法,用classmethod来进行修饰 @classmethod def getCountry(cls): return cls.country p = People() print p.getCountry() #可以用实例对象引用 print People.getCountry() #可以通过类对象引用
类方法还有一个用途就是可以对类属性进行修改:
class People(object): country = 'china' #类方法,用classmethod来进行修饰 @classmethod def getCountry(cls): return cls.country @classmethod def setCountry(cls.country): cls.country = country p = People() print p.getCountry() #可以用实例对象引用 print People.getCountry() #可以通过类对象引用 p.setCountry('japan') print p.getCountry() print People.getCountry()
结果显示在用类方法对类属性修改之后,通过类对象和实例对象访问都发生了改变 2、静态方法: 需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数。
class People(object): country = 'china' @staticmethod #静态方法 def getCountry(): return People.country print People.getCountry()
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性,不过存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类引用。
六、new()方法
class A(object): def _init_(self): print('这是init方法') def _new_(self): print('这是new方法') return object._new_(cls) A()
_new_至少要有一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供_new_必须要有返回值,返回实例化出来的实例,这点在自己实现_new_时要特别注意,可以return父类_new_出来的实例,或者直接是object的_new_出来的实例_init_有一个参数self,就是这个_new_返回的实例,_init_在_new_的基础上可以完成一些其他初始化的动作,_init_不需要返回值我们可以将类比作制造商,_new_方法就是前期的原材料购买环境,_init_方法就是在有原材料的基础上加工,初始化商品环节
1、单例模式: #实例化一个单例
class Singleton(object): _instance = None _first_init = False def _new_(cls,age,name): if not cls._instance: cls._instance = object._new_(cls) return cls._instance def _init_(self,age,name): if not self._first_init: self.age = age self.name = name Singleton._first_init = True a = Singleton(18,'dongge')b = Singleton(8,'dongge ')print(id(a))print(id(b))print(a.age)print(b.age)a.age = 19print(b.age)
创作者:Eric· Charles
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~