面向对象的特性是:封装、继承、多态
封装
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方法即可。