封装继承多态

Posted wn-888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装继承多态相关的知识,希望对你有一定的参考价值。

封装是面向对象的三大特性之一

封装指的是隐藏对象中的一些不希望被外部所访问的属性或方法

如果隐藏一个对象中的属性?

将对象的属性名,修改为一个外部不知道的名字

如何获取(修改)对象中的属性?

  • 需要提供一个getter和setter方法使外部可以访问到属性

  • getter 获取对象中指定属性(getter_属性名)

  • setter 用来设置对象中指定属性(setter_属性名)

使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全性

  1. 隐藏了属性名,使用调用者无法随意的修改对象的属性确保了数据的安全性

  2. 增加了getter和setter方法,很好的控制了属性是否是只读的

    1. 如果希望属性是只读的,则可以直接去掉setter方法

    2. 如果希望属性不能被外部访问,则可以直接去掉getter方法

  3. 使用setter方法设置属性,可以增加数据的验证,确保数据的值是正确的。

  4. 使用getter方法获取属性,使用setter方法设置属性

    1. 可以在读取属性和修改属性的同时做一些其他的处理

  5. 使用getter方法可以表示一些计算的属性

class Dog:
‘‘‘
表示狗的类
‘‘‘
def __init__(self,name):
self.hidden_name = name
def say_hello(self):
print(‘大家好,我是%s‘%hidden_name)
def get_name(self):
‘‘‘
get_name()用来获取对象的name属性
‘‘‘
return self.hidden_name
def set_name(self,name)
self.hidden_name = name
d = Dog(‘旺财‘)
d.say_hello()

可以为对象的属性使用双下划线开头,__xxx

双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部进行访问,无法通过对象进行访问

其实隐藏属性只不过是python自动为属性改了一个名字

实际上将名字修改为,_类名__属性名

class person:
def __init__(self,name):
self.__name = name
def get_name(self)
return self.__name
def set_name(self,name)
self.__name = name
p = person(‘孙悟空‘)
#print(p.__name)__开头的属性是隐藏属性,无法通过对象访问
#p.__name = ‘猪八戒‘
print(p.set_name())
?

继承是面向对象三大特性之一

  • 通过继承我们可以使一个类获取到其他类中的属性和方法

  • 在定义类时,可以在类名后的括号中指定当前类的父类(超类,基类,supper)

    • 子类(衍生类)可以直接继承父类中的所有的属性和方法

 

通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合opc原则

所有我们经常需要通过继承来对一个类进行扩展

class Dog(Animal):
def bark(self):
print(‘汪汪汪····‘)
d = Dog()
print(d)

在创建类时,如果省略了父类,则默认父类为object。object是所有类的父类,所有类都继承自object

class Person(object):

pass

issubclass()检查一个类是否是类一个类的子类

isinstance()检查一个对象是否是一个类的实例,如果这个类时这个对象的父类,也会返回True,所有的对象都是object的子类

多态是面向对象的三大特征之一

多态从字面上理解是多种形态

一个对象可以以不同的形态去呈现

定义一个函数,只要对象中含有name属性,他就可以作为参数传递

这个函数并不会考虑对象的类型,只要name属性即可

def say_hello(obj):
print(‘你好%s‘%obj.name)

def say_hello_2(obj):
#做类型检查
if isinstance(obj,A):
print(‘你好%s‘%obj.name)
#say_hello(b)

鸭子类型

如果一个东西,走路像鸭子,叫声像鸭子,那么他就是鸭子

len()

之所以一个对象能通过len()来获取长度,是因为对象中具有一个特殊方法——len—— 换句或说,只要对象中具有len特殊方法,就可以通len()来获取它的长度

面向对象的三大特征:

封装

确保了对象中的数据安全

继承

保证了对象的可扩展性

多态

保证了程序的灵活性

 

以上是关于封装继承多态的主要内容,如果未能解决你的问题,请参考以下文章

封装继承和多态

面向对象的三大特性:继承封装多态

[UE4]封装继承多态

0面向对象三大机制 封装继承多态

0面向对象三大机制 封装继承多态

封装多态继承