面向对象(中)魔术方法、封装、property

面向对象(中)魔术方法、封装、property

一、 特殊方法(魔术方法)
  • 在类中可以定义一些特殊方法也称为魔术方法

  • 特殊方法形发 xxx()

  • 特殊方法不需要调用,特殊方法在特殊时候自动调用

    • '''
      类的基本结构
      
      class 类名([父类]):
      	公共属性
      	# 对象的初始化方法
      	def __init__(self,....)
      		.....
        
        # 其他的方法
        def method1(self,....):
        	.....
        def method2(self,....):
        	.....
        	 
      '''
      
    • class Person:
          name = '老大'
          def speak(self):
              print('我是%s'%self.name)
              return 'a'
      
      p1 = Person()
      print(p1.name)
      print(p1.speak())
      # 老大
      # 我是老大
      # a
      
      p2 = Person()
      p2.name ='老二'
      print(p2.name)
      p2.speak()
      print(p2.speak())
      # 老二
      # 我是老二
      # 我是老二
      # a
      
      # 以上例手动增加属性值不友好,容易出错
      # 以下采用魔术方法,方便理解,不容易出错
      class Person:
          def __init__(self,name):
              self.name = name
          def speak(self):
              print('我是%s'%self.name)
      
      p1 = Person('老大')
      p2 = Person('老二')
      p1.speak()
      p2.speak()
      # 我是老大
      # 我是老二
      
二、 封装
  • 出现封装的原因:增强数据的安全性

      1. 属性不能随意修改
      1. 属性不能改为任意值
  • 封装是面向对象三大特性之一

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

  • getter() 和 setter() 方法可从外部访问属性

    • getter() 获取对象中指定的属性
    • setter() 设置对象中指定的属性
  • 使用封装,增加了类的定义复杂度,但增强了安全性

    • 隐藏属名性,使调用无法随意的修改对象中的属性

    • 增加了getter() 和 setter() ,很好控制属性是只读的

      • 如果希望属性可读,可直接去掉getter()方法
      • 如果希望属性不被外部访问,可直接去掉setter()方法
    • 用setter()方法设置属性,可增加数据的验证,以确保数据的值是正确的

    • 使用getter() 方法和 setter() 方法获取和设置属性时,可在设置和修改属性时做其他的操作

      • class Dog:
            def __init__(self,name,age):
                self.h_age = age
                self.h_name = name
            def speak(self):
                print('%d岁的%s叫了一声汪呜'%(self.h_age,self.h_name))
        
            def get_name(self):
                return self.h_name
        
            def set_name(self,name):
                self.h_name = name
        
            def get_age(self):
                print('用户读取了属性')
                return self.h_age
        
            def set_age(self,age):
                print('用户修改了属性')
                if age > 0:
                    self.h_age = age
        
        d = Dog('柴柴',3)
        d.name = '二哈'
        print(d.h_name,d.name)       # 柴柴 二哈
        
        print(d.get_name())          # 柴柴
        
        d.set_name('中华田园')
        print(d.get_name())          # 中华田园
        d.speak()                    # 3岁的中华田园叫了一声汪呜
        
        d.set_age(6)
        print(d.get_age())          
        # 用户修改了属性
        # 用户读取了属性
        # 6
        
        
  • 可以为对象的属性使用双下划线开头。双划线开头的属性,是属性的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问

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

  • __name = _类名_name

  • 这种方式实际上依然可以在外部被访问,所以这个方式一般不用。一般会将私有属性以_开头

  • 一般情况下,使用_开头的属性都是私有属性,没有特殊情况不要修改私有属性

三、 property 装饰器
  • 可以使用@property装饰器来创建私有属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,防止属性被修改

    • class Person:
          def __init__(self,name):
              self._name = name
      
          @property   # 将方法转换为相同名称的只读属性
          def name(self):
              return  self._name
      
          @name.setter  # setter方法的装饰器 @属性.setter
          def name(self,name):
              self._name = name
      
      p = Person('老大')
      p.name = '老二'
      print(p.name)       # 老二
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值