面向对象初接触(下)

当一个类中的属性条件不满足我们的需求时,考虑到为了不破坏封装,从而对其属性进行增加的实现,就有了以下几种方法
 
猴子补丁
from test01 import Person
from test001 import get_score
 
def monkeypatch4Person():
     Person.get_score = get_score
 
monkeypatch4Person()
if __name__== '__main__':
   print(print(Person().get_score))
#Person类get_score方法是从数据库拿数据,但是不方便测试,使用猴子补丁,替换了get_score方法,返回模拟的数据
 
属性装饰器
 
#把实例的属性保护起来,不让外部直接访问,外部使用getter读取属性和setter方法设置属性
class Person:
     def __init__(self,name,age=18):
         self.name = name
         self.__age = age
 
     def age(self):
         return self.__age
 
     def set_age(self,value):
         self.__age = value
通过age 和set_age方法操作属性
class Person:
  def __init__(self,name,age=18):
     self.name = name
     self.__age = age
 
  @property
  def age(self):
         return self.__age
 
  @age.setter
  def age(self,age):
         self.__age = age
 
  @age.deleter
  def age(self,age):
         del self.__age
         print('del')
 
tom = Person('tom')
print(tom.age)
tom.age = 20
print(tom.age)
del tom.age
#特别注意:这三个方法同名
#property装饰器
#后面的函数名就是以后的属性名,他就是getter,这个一定要有,他提供了可读性
#setter装饰器
#与属性名同名,且接受2个参数,第一个是self,第二个是将要赋值的值,有了它,属性可写
#deleter装饰器
#可以控制是否删除属性,少用
#property装饰器必须在前,setter,deleter装饰器在后
#property装饰器能通过简单的方式,把对方法的操作编程对属性的访问,并起到了一定隐藏效果
 
#也可以如下
class Person:
   def __init__(self,name,age=18):
         self.name = name
         self.age = age
  age = property(lambda self:self.__age)
tom =Person('tom')
print(tom.age)
对象的销毁
class Person:
  def __init__(self,name,age=18):
      self.name = name
      self.age = age
 
  def __del__(self):
      print('delete {}'.format(self.name))
 
tom = Person('tom')
del tom
 
python没有方法重载
python是动态强类型语言,赋值及定义,所以定义灵活,不需要指定类型
 
封装
面向对象的三要素之一
封装:
将数据和操作组织到类中,即属性和方法
将数据隐藏起来,给使用者提供操作,使用者通过操作就可以获取或者修改数据,getter和setter
通过访问控制,暴露适当的数据给用户,隐藏该隐藏的,保护成员或私有成员

posted on 2017-11-12 17:41  pythonerLau  阅读(107)  评论(0编辑  收藏  举报

导航