面向对象(中)魔术方法、封装、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() # 我是老大 # 我是老二
-
二、 封装
-
出现封装的原因:增强数据的安全性
-
- 属性不能随意修改
-
- 属性不能改为任意值
-
-
封装是面向对象三大特性之一
-
封装是指隐藏对象中一些不希望被外部访问到的属性和方法
-
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) # 老二
-