- 面向对象的三大特性
- 封装
封装使程序更安全 - 继承
继承使程序扩展性更高 - 多态
多态使程序更加灵活
封装
- 封装是面向对象的三大特性之一
- 封装使程序更安全
- 在python中,方法、属性是没有修饰符得,但是我们有时不行别人修改我们的属性值,我们可以这样做
class MyClass():
def __init__(self,name):
# 将变量改掉,让外部不知道内部使用的变量名称是什么
self.hidden_name = name
def say_hello(self):
print(self.hidden_name,'你好!!')
mc = MyClass('李四');
mc.say_hello();
当然,如果一定要趴源码然后:mc.hidden_name = ‘王五’,也是可以修改的 - 私有属性:在变量名称前加双下划线,那这个变量就变成私有的了,只能在内部使用
class MyClass():
def __init__(self,name):
self.__name = name
def say_hello(self):
print(self.__name,'你好!!')
mc = MyClass('李四');
mc.say_hello();
此时在执行:mc.__name = ‘王五’ 就没有办法修改了,如果直接调用mc.__name会报错
在我们开发过程中,是没有办法做到完全隐藏的,双下划线变量,在python内部其实是修改成了:_类名__变量名# 这行代码依旧可以修改 __name值
mc._MyClass__name = '王五'
- 一般我们不会去想办法去隐藏,多是使用一个下划线来提示使用者,告诉他们我的这个变量是不建议你修改的。
- 一般隐藏的属性变量,我们还是要给getter、setter方法,打开修改权限的
def get_name():
pass
def set_name(self,name):
self._name = name
- 方法装饰器
有时候我们会觉得写getter、setter方法太过麻烦
我们可以使用装饰器 把方法修饰成变量使用
注意 方法名称和变量名称要一样# getter装饰器 使用关键字property
@property
def name():
pass
# setter装饰器 使用变量名.setter
@name.setter
def name(self,name):
self._name = name
修饰以后方法的使用# 获取那么的值
mc.name
# 修改name的值
mc.name = '王五'
- getter、setter的关系
单有getter可以
使用setter方法必须有getter方法,先保证能读才能修改
继承
- 继承是面向对象的三大特性之一
- 继承使程序扩展性更高
- 通过继承可以使一个类使用其他类中属性和方法
- 语法:
- class A(B) --> A类继承了B类 *
- 多重继承时,使用逗号分开 class A(B,C,D)多重继承会导致代码的过度复杂*
- 检查语法:
- isinstance(a,b) --> 检擦a是否为b的实例*
- issubclass(a,b) --> 检查a是否为b的子类*
- 类名.bases --> 元组形式打印类的所有父类*
# 定义一个类
class Animal:
def run(self):
pass
# 定义一个类 并且 继承Animal类
class Dog(Animal):
def abc(self):
pass
- 父类中所有属性和方法都可以被子类继承,包括特殊方法
重写 - 在继承中,子类可以复写父类中方法,称之为重写
多态
- 多态是面向对象的三大特性之一
- 多态使程序更加灵活
简单的一个例子# len() 函数就是多态的表现
a = [1,2,3,40]
s = 'hello'
t = ('a','b','c','d','e','f','g')
print(len(a))
print(len(s))
print(len(t))
# 是因为list、str、tuple这几个类中都有一个特殊方法‘__len__’
# 如果我创建一个类 在使用len函数则会报错
class A:
pass
a = A()
print(len(a))
# 但是给A类添加一个特殊方法,就可以使用len函数了
class A:
def __len__(self):
return 123
a = A()
print(len(a))
以上就是对多态的解释和使用说明