当前位置 : 主页 > 编程语言 > python >

Python ❀ 面向对象(二)

来源:互联网 收集:自由互联 发布时间:2022-06-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 = 19
print(b.age)

创作者:Eric· Charles


上一篇:Python ❀ 制作简单的五子棋游戏
下一篇:没有了
网友评论