面对对象(下)
一、什么是封装
简单的理解封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。
二、为什么要封装
把一台洗衣机看做洗衣机类的一个实例,洗衣机里有标准洗、速洗、精洗、桶干燥、洁桶等多种功能。作为用户不需要知道这些功能内部的具体实现,需要某项功能只要选择对应的功能键即可。这就是洗衣机封装了以上多种功能。
三、封装的方法
1、简单的更名封装
更名封装主要是形参在引入到函数内部,进实参进行重新赋值,以达到隐藏的目的
class Dog:
def __init__(self, name, age):
self.hidden_name = name
self.hidden_age = age
def speak(self):
print('大家好,我是%s'%self.hidden_name)
d = Dog('二哈',5)
print (d.speak())
2、属性(包括方法、数据)名字前面加两个下划线
_类名__属性名 例如 __name --> _Person__name**(也可以使用单下划线)**
class Dog:
def __init__(self, name, age):
self.__name = name
self.__age = age
def speak(self):
print('大家好,我是%s' % self.__name)
d = Dog('二哈', 5)
d.__name = '狼狗' ##不可以修改
d._Dog__name = '狼狗' ##可以修改
print(d.speak())
getter和setter方法,控制属性的是否只读和修改
class Dog:
def __init__(self, name, age):
self.hidden_name = name
self.hidden_age = age
def speak(self):
print('大家好,我是%s'%self.hidden_name)
def get_age(self):
return self.hidden_age
def set_age(self, age):
self.hidden_age = age
d = Dog('二哈',5)
print (d.speak())
print (d.get_age())
d.set_age(8)
print(d.get_age())
@property 用来修饰方法的
作用:
1 @property来创建只读属性,会将方法转换成相同名称的属性
2 可以防止属性被修改
class Dog:
def __init__(self, name, age):
self.hidden_name = name
self.hidden_age = age
@property
def speak(self):
print('大家好,我是%s' % self.hidden_name)
def sp(self):
print('大家好,我是%s' % self.hidden_name)
d = Dog('二哈', 5)
print(d.speak)
print(d.sp())
继承
object是所有类的父类,所有类都继承与object
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
class Animal:
def run(self):
print('动物会跑')
def sleep(self):
print('动物睡觉')
class Dog(Animal):
def look_home(self):
print('狗看家')
d = Dog()
d.run()
d.sleep()
d.look_home()
方法的重写
class Animal:
def run(self):
print('动物会跑')
def sleep(self):
print('动物睡觉')
class Dog(Animal):
def run(self):
print('狗跑')
def look_home(self):
print('狗看家')
d = Dog()
d.run()
d.sleep()
d.look_home()