Python ❀ 面向对象(二)

网友投稿 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小时内删除侵权内容。

上一篇:Python ❀ 制作简单的五子棋游戏(python怎么读)
下一篇:Python ❀ 面向对象(三)(python入门教程(非常详细))
相关文章

 发表评论

暂时没有评论,来抢沙发吧~