1. 类中的特殊方法
- 在类中定义的一些特殊方法也称为魔法方法
- 特殊方法格式 __xxx__( )
- 特殊的方法在特定的时候会自动调用。比如 __init__( ) 在初始化的时候就被调用
- 类定义中的self指的是类的实例(instance)
- 在类的实例化的时候, 创建出来的实例是个空壳,所以需要定义__init( )__来给实例传递一些数据
- __init( )__ 中定义的属性, self.attr, 是实例的属性。 如果像这样调用属性, Class.__init( )__,这里的参数是类中的属性
2. 类的封装
- 面向对象三大特性: 封装,继承,多态
- 为什么需要封装: 增强数据安全性
- 隐藏属性,不让客户随意访问到
- 不让客户轻易修改属性
- Python中的封装是相对的,不是决定的。 一般以下滑线开头的属性, 都是封装的特殊属性, 提醒用户不要随意访问修改。
- 其他编程语言如C++ 实现封装,把属性分为共有属性和私有属性, 只有共有属性才能被外界访问
- 我们可以定义getter( )、setter( ) 来外部访问修改封装属性
- 类中的属性如以单下划线 “_” 开头, 如 _name, 外界上能访问, obj._name
- 类中的属性如如以双下划线 “__” 开头,如 __name,外接不能访问, obj.__name。 如果外界直接访问, 形式为 obj._Class__name; 在类内部,self.__name可以被访问
- _name 或 __name 可以理解为私有属性, 不建议外部直接访问。如果要访问, 那么就要通过方法或者property装饰器访问
3. property装饰器
class Person:
def __init__(self, name):
self._name = name
def speak_name(self):
print('大家好,我是%s' % self.name)
@property
def name(self):
print("Successful to get the name")
return self._name
@name.setter
def name(self, name):
self._name = name
print('Successfully change the name as %s' % self._name)
@name.deleter
def name(self):
del self._name
print("Successfully deleted name attribute")
p1 = Person("LeBron James")
print(p1.name)
p1.name = "Bronny"
del p1.name
-
属性可以是变量,也可以是方法
-
Person 内部真正的变量是_name,name其实是一个方法,用上@property 之后, name就好像是p1的一个变量
-
name这时候也是p1的一个属性。p1中所有的属性:
-
del p1.name
,是把_name 这个属性给删除了, name还在