面向对象的三大特性: 封装,继承,多态 是面向对象的三大特性
面向对象编程,是许多编程语言都支持的一种编程思想。
简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发。
封装: 封装指的是把相关属性变量和方法封装在类里,比如把汽车相关属性和方法封装为汽车类这样就能在不同的项目里重用这个类。
#声明一个类 Car class Car: """ 定义一个属性 """ price = 0 owner = ' ' #构造一个方法 __init__ def __init__(self,price,owner): self.price = price self.owner = owner print('Owner is:' + self.owner) print('Owner is:' +str(self.price)) #实例化类并使用,并赋值给对象mycar myCar = Car(1000,'Lei Jun')
简单理解是:基于模板(类)去创建实体(对象)调用类Car 并赋值给一个对象 myCar 这就相当于创建了一个对象。
2.私有属性和私有方法
既然有共有的属性就会有私有的属性,私有属性和私有方法的设立之初呢? 是为了提高数据的安全,禁止外部
在类中,出于封装的考虑往往会把一些实现细节定义成私有属性,通过外部的实例是无法直接访问这些私有属性,如果外部实例需要访问私有属性,则必须通过类提供的get 和set 方法。
https://pan.baidu.com/s/1KCKkV13ymltq9CMXE3qxJA?pwd=1234
定义私有成员的方式非常简单,只需要:
私有成员变量:变量名以__开头(2个下划线)
私有成员方法:方法名以__开头(2个下划线)
即可完成私有成员的设置
class Phone: imet = None producer = None #私有属性 __current_voltage = None #私有方法 def __keep_single_core(self): print("让CPU以单核模式运行以节省电量") Phone = Phone() #创建对象
之前提到,私有属性和由类定义的私有方法也无法在外部被调用,而封装特性的精髓在于合理地定义类的私有属性和私有方法,存在私有成员变量和私有成员方法的核心作用是屏蔽内类内部的实现细节。
通过类对象直接调用私有方法,这是不允许的。
class Phone: imet = None producer = None #私有属性 __current_voltage = None def call_by_5g(self): self.__keep_single_core() #私有方法 def __keep_single_core(self): print("让CPU以单核模式运行以节省电量") Phone = Phone() #创建对象 Phone.__keep_single_core() #正确的用法
虽然说,私有成员无法被类对象使用,但是可以被其它的成员使用:
例如:
class Phone: imet = None producer = None #私有属性 __current_voltage = None #下面 call_by_5g 是一个内部的成员方法 def call_by_5g(self): self.__keep_single_core() #私有方法 def __keep_single_core(self): print("让CPU以单核模式运行以节省电量") Phone = Phone() #创建对象 #通过内部的成员方法去调用私有方法 Phone.call_by_5g() #正确的用法
如果你应要从类对象外部去调用私有属性和私有方法,给你提供几点建议(用法的取舍是保留意见的,但可根据项目情况做特殊处理)
方式一:文章开头讲过,可以通过类提供的 get 和 set 方法进行读取和修改类的私有属性:
# coding = utf -8 class Car: #私有属性 __Insured = False #5 #针对私有属性的get和set 方法 def get_Insured(self): # 8 8的方法是返回 5的值 False return self.__Insured def set_Insurd(self,Insured): #3 self.__Insured = Insured #4 会调用 私有属性5 False = False #实例化对象 myCar = Car() #1 myCar.set_Insured(False) #2 向第3中的 Insured 传入参数 False myCar.__Insured=True #6 执行6时 不会去调用 5 修改 __Insured 的值为True print(myCar.get_Insured()) # 输出Flase #7 7会调用 8 并输出8 返回结果 print(myCar.__Insured) # 输出True # 9 输出6的结果 True #给私有属性重命名 myCar._Car__Insured = True #10通过给私有方法重命名的方式来访问5并且将5的False修改为 True #get方法访问私有属性 print(myCar.get_Insured()) # 11 输出步骤10的结果True
执行步骤:如 # 1.... # 2 ...... 步骤6 myCar.__Insured=True 本来应该去调用步骤5的__Insured = False,并且将 False 修改为 True,但事实并没有,我也不知道它调用了什么? 八嘎呀路
方式二:在python中通过给私有方法重新命名也可以实现成功调用私有方法。
私有方法重命名的方式和私有属性的一致,都是_类名+私有方法名
class Phone:
imet = None
producer = None
#私有属性
__current_voltage = None
return
def call_by_5g(self):
self.__keep_single_core()
#私有方法
def __keep_single_core(self):
print("让CPU以单核模式运行以节省电量")
Phone = Phone() #创建对象
Phone._Phone__keep_single_core() #不推荐的用法 因为会破坏类的封装性
总结 : 这一块不太简单,哪里不懂,请留言收到后第一时间回复