python精讲之面向对象(2)

文章目录

    • 特殊方法
      • __init __方法
    • 封装
      • 隐藏属性

特殊方法

  • 在类中可以定义⼀些特殊⽅法也称为魔术⽅法
  • 特殊⽅法都是形如 xxx()这种形式
  • 特殊⽅法不需要我们调⽤,特殊⽅法会在特定时候⾃动调⽤

注意:特殊方法“xxx”前后分别有两个下划线!!!

__init __方法

__init__方法会在类的实例化的时候,自动的调用,因此__init__方法也被称为初始化方法
如下若是没有定义属性name,在调用函数时则会报错

class Myclass():
    
    def pr(self):
        print(self.name)
        
mc = Myclass()
mc.pr
AttributeError: 'Myclass' object has no attribute 'name'

但是在定义了__init__方法之后,明明没有调用__init__但是函数pr仍然可以调用,这就是特殊方法__init__,初始化方法,自动调用

class Myclass():
    def __init__(self):
        self.name = "你好"
    def pr(self):
        print(self.name)
        
mc = Myclass()
mc.pr()
你好
class Myclass():
    def __init__(self,name):
        self.name = name
    def pr(self):
        print(self.name)
        
mc = Myclass('您好')
mc1 = Myclass('欢迎光临我的博客')
mc.pr()
mc1.pr()
您好
欢迎光临我的博客

封装

封装、继承和多态是面向对象的三大特点
封装是指隐藏对象中⼀些不希望被外部所访问到的属性或⽅法
而这篇博客来简单讲解讲解封装
出现封装的原因:
我们需要⼀种⽅式来增强数据的安全性

  1. 属性不能随意修改
  2. 属性不能改为任意的值

如果直接用普通的面向对象程序,我们发现属性值可以随意修改,无法保证数据的安全性
如下:

class Myclass():
    def __init__(self,name):
        self.name = name
    def pr(self):
        print(self.name)
        
mc = Myclass('你好')
mc.pr()
你好
class Myclass():
    def __init__(self,name):
        self.name = name
    def pr(self):
        print(self.name)
        
mc = Myclass('你好')
mc.name = '欢迎来到我的博客'
mc.pr()
欢迎来到我的博客

于是我们产生封装的手段来增强数据的安全性,但是,只是增强数据的安全性,并不能保证数据绝对安全
python精讲之面向对象(2)_第1张图片

  • 举个栗子:大家都喜欢网购,而在网购之后则是商家发送快递,快递就相当于我们代码,然后快递不会直接将商品不加封装直接发给你,因为这样不安全,可能因为各种原因损坏;
  • 但是加个包装就相当于代码加了封装,于是提高了安全性,但是包装太过了,比如围一层钢板也会导致用户难以打开包装;
  • 于是使用纸箱,胶带等,这样增强了安全性但也不能保证绝对安全,防君子不防小人,一般人不会动你的快递但不能保证那些小偷呀,恶意拿你快递的等等。。。去破坏你的快递,也就是说一般人不会动你的代码,但是若是有人故意去破坏你的代码就还是无法保证

属性封装:

  1. 将属性名修改成一个外部不知道的名字
    (隐藏属性名,使调⽤这⽆法随意的修改对象中的属性)
  2. 需要提供一个getter和setter方法访问属性和修改属性
    (使⽤setter()设置属性,可以在呢及数据的验证 4. 使⽤getter()⽅法获取属性,使⽤setter()⽅法设置属性可以在读取属 性和修改属性的同时做⼀些其他的处理)
class Myclass():
    def __init__(self,name):
        self.hidden_name = name
    def pr(self):
        print(self.hidden_name)
    def get_name(self):   #定义一个方法get_name获取name属性
        return self.hidden_name
    def set_name(self,name):  #定义一个方法set_name方法修改name属性
        self.hidden_name = name
mc = Myclass('你好')
mc.name = '欢迎来到我的博客'

mc.set_name('欢迎')
print(mc.get_name())
你好
欢迎
class Myclass():
    def __init__(self,name):
        self.hidden_name = name
    def pr(self):
        print('方法结果是',self.hidden_name)
    def get_name(self):   #定义一个方法get_name获取name属性
        return self.hidden_name
    def set_name(self,name):  #定义一个方法set_name方法修改name属性
        self.hidden_name = name
mc = Myclass('你好')
mc.name = '欢迎来到我的博客'

mc.set_name('欢迎')
mc.pr()
方法结果是 欢迎

使用封装增加了类定义的复杂程度,但是同时增加了数据的安全性
如果希望属性只读,则直接去掉setter方法
如果希望属性不被外部访问,则直接去掉getter方法
小知识:

  • 用getter而方法和setter方法可以做附加操作,比如加一些方法做个用户访问数据什么的

隐藏属性

  • 可以为对象的属性使⽤双下划线开头 __xxx。双下划线开头的属性,是对象 的隐藏属性,隐藏属性只能在类的内部访问,⽆法通过对象访问
  • 其实隐藏属性只不过是Python⾃动为属性改了⼀个名字 --> _类名__属性 名 例如 __name -> _Person__name 这种⽅式实际上依然可以在外部访问,所以这种⽅式我们⼀般不⽤。⼀般我 们会将⼀些私有属性以_开头
  • ⼀般情况下,使⽤_开头的属性都是私有属性,没有特殊情况下不要修改私有 属性
class Myclass():
    def __init__(self,name):
        self.__name = name
    def pr(self):
        print('方法结果是',self.__name)
    def get_name(self):   #定义一个方法get_name获取name属性
        return self.__name
    def set_name(self,name):  #定义一个方法set_name方法修改name属性
        self.__name = name
mc = Myclass('你好')
mc.__name = '欢迎'
print(mc.get_name())
mc.pr()
print(mc._Myclass__name)
你好
方法结果是 你好
你好

你可能感兴趣的:(魔术方法,封装,隐藏属性,python,封装,隐藏属性,特殊方法,__init__)