封装是面向对象的三大特性之一
封装指的是隐藏对象中的一些不希望被外部所访问的属性或方法
如果隐藏一个对象中的属性?
将对象的属性名,修改为一个外部不知道的名字
如何获取(修改)对象中的属性?
-
需要提供一个getter和setter方法使外部可以访问到属性
-
getter 获取对象中指定属性(getter_属性名)
-
setter 用来设置对象中指定属性(setter_属性名)
使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全性
-
隐藏了属性名,使用调用者无法随意的修改对象的属性确保了数据的安全性
-
增加了getter和setter方法,很好的控制了属性是否是只读的
-
如果希望属性是只读的,则可以直接去掉setter方法
-
如果希望属性不能被外部访问,则可以直接去掉getter方法
-
使用setter方法设置属性,可以增加数据的验证,确保数据的值是正确的。
-
使用getter方法获取属性,使用setter方法设置属性
-
可以在读取属性和修改属性的同时做一些其他的处理
-
使用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())
继承是面向对象三大特性之一
通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合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()来获取它的长度
面向对象的三大特征:
封装
确保了对象中的数据安全
继承
保证了对象的可扩展性
多态
保证了程序的灵活性
来源:https://www./content-4-583401.html
|