简友广场

7,Python面向对象2

2019-08-20  本文已影响0人  软件软软

保护对象的属性

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

        对象名.属性名 = 数据 ---->直接修改

        对象名.方法名() ---->间接修改

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

将属性定义为私有属性

添加一个可以调用的方法,供调用

Python中没有像C++中public和private这些关键字来区别公有属性和私有属性

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

一:__del__()方法

创建对象后,python解释器默认调用__init__()方法;

当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。

当有1个变量保存了对象的引用时,此对象的引用计数就会加1,

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

 单继承

继承:有两类,A类和B类,如果说A类继承至B类,那么A类称为子类,B类称为父类,A类就拥有B类的所有属性

object是所有类的父类,或者是基类或超类

继承的作用:

1.减少了代码的冗余

2.提高了代码的健壮性(改动父类)

3.提高了代码的安全性

4.是多态的前提

缺点:耦合与内聚是描述类与类之间的关系的。耦合性越低,内聚性越高,代码越优良

在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物。

# 定义一个父类:

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__方法

总结

子类在继承的时候,在定义类时,小括号()中为父类的名字

父类的属性、方法,会被继承给子类。

多继承

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

# 定义一个父类

class  A:

        def  printA(self):

            print('----A----')

# 定义一个父类

classB:

        def  printB(self):

                print('----B----')

# 定义一个子类,继承自A、B

class  C(A,B):

        def  printC(self):

                print('----C----')

obj_C = C()

obj_C.printA()

obj_C.printB()

运行结果:

----A----

----B----

Python中是可以多继承的,

父类中的方法、属性,子类会继承。

注意:

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

classbase(object):

        def  test(self):

                print('----base test----')

class  A(base):

        def  test(self):

                print('----A test----')

# 定义一个父类

class  B(base):

        def  test(self):

                print('----B test----')

# 定义一个子类,继承自A、B

class  C(A,B):

        pass

obj_C = C()

obj_C.test()

print(C.__mro__)#可以查看C类的对象搜索方法时的先后顺序

运行结果:

----A test----

这是为什么呢?

上一篇下一篇

猜你喜欢

热点阅读