Python面向对象介绍中篇

Python面向对象(2)

1、保护对象的属性

如果有一个对象,当需要对其进行修改属性时,有两种方法

  • 对象名.属性名 = 数据 —->直接修改
  • 对象名.方法名() —->间接修改

为了更好的保存属性安全,即不能随意修改,一般的处理方式为

  • 将属性定义为私有属性
  • 添加一个可以调用的方法,供调用

私有共有属性区分

它是以属性命名方式来区分,如果在属性名前面加了2个下划线’__’,则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。

2、_del_()方法

  • 当有1个变量保存了对象的引用时,此对象的引用计数就会加1
  • 当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除

3、单继承

3.1、继承的概念

在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承自狗,如下如所示:

3.2、继承示例

说明:

  • 虽然子类没有定义__init__方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__方法

总结

  • 子类在继承的时候,在定义类时,小括号()中为父类的名字
  • 父类的属性、方法,会被继承给子类

3.3、注意点

  • 私有的属性,不能通过对象直接访问,但是可以通过方法访问
  • 私有的方法,不能通过对象直接访问
  • 私有的属性、方法,不会被子类继承,也不能被访问
  • 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用

4、多继承

所谓多继承,即子类有多个父类,并且具有他们的特征

注意点

想一想:

如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?

5、重写与调用父类方法

5.1、重写父类方法

所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法

5.2、调用父类方法

6、多态

其实多态的概念,一般应用于Java这类强类型语言中, 而Python崇尚“鸭子类型”

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态

  • Python伪代码实现Java或C#的多态

鸭子类型

7、类、实例 | 属性

7.1、类属性

class People(object):
    name = 'A2Data'  #公有的类属性
    __age = 22     #私有的类属性

p = People()

print(p.name)        #正确
print(People.name)   #正确
print(p.__age)       #错误,不能在类外通过实例对象访问私有的类属性
print(People.__age)  #错误,不能在类外通过类对象访问私有的类属性

7.2、实例属性(对象属性)

class People(object):
    address = '北京' #类属性
    def __init__(self):
        self.name = 'A2Data' #实例属性
        self.age = 22 #实例属性

p = People()
p.age =18 #实例属性
print(p.address) #正确
print(p.name)    #正确
print(p.age)     #正确

print(People.address) #正确
print(People.name)    #错误
print(People.age)     #错误

通过实例(对象)去修改类属性

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)

归纳

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

8、静态和类 | 方法

8.1、类方法

类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。

用类方法对类属性修改之后,通过类对象和实例对象访问都发生了改变

8.2、静态方法

需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数

评论