python面向对象

71 阅读1分钟

面向对象的特性是:封装、继承、多态

封装

1.内置__init__方法 2.私有属性or方法以__开头,比如__name就是一个私有属性,此时对象是无法访问到的,因为Python内部将该私有属性重命名了,注意两边都有__对象是可以访问的,这种不是私有属性,比如__dir__就是一个对象可以访问的属性 3.用dir可以访问到对象的所有属性,其实内部是实现了__dir__

class Student(object):
    _name = '2132'
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def __len__(self):
        return 100

```
if __name__ == '__main__':
    s = Student('W', 12)
    print(len(s))
    all_va = dir(s)
    for va in all_va:
        print(va, eval(f's.{va}'))
    s.__name = '2323'
    name = s.get_name()
    print(name)
    print(s._name)
```

继承

1.子类可以继承父类,而且是多继承 2.子类继承父类,可以继承父类里面的属性和方法,这样不比自己重新写,而且新增方法,也可以重写父类的方法,重写父类的方法就是多态

多态

1.多态是开闭原则的基础 2.鸭子类型

def test(person):
    person.run()

class Person(object):
    def run(self):
        print('person run')

class Man(Person):
    def run(self):
        print('man run')

class Student2(Person):
    def run(self):
        print('student run')

class Peter(object):
    def run(self):
        print('peter run')

if __name__ == '__main__':
    # # 鸭子类型 因为Python没有声明,所以你在传进去的时候只要实现了run方法,那么它就是一只鸭子,不严格限制继承
    test(Man())
    test(Peter())
    test(Student2())

这里的Peter类型并没有继承Person类,但是却可以运行出来结果是:peter run,这是因为Python的鸭子类型:只要像鸭子,那么它就是一只鸭子,不需要继承一只鸭子,所以在test方法里面,只要传的对象有run方法即可。