Python 面向对象—类
一、成员变量
类的属性 | 类的成员变量说明(均出现在__init__初始化方法中) | 可见性 |
---|---|---|
z | 公有属性 | 全部范围可见 |
_y | 保护属性(以_ 单杠开头) | 同包内可见(实例点取) |
__x | 私有属性(以__ 双杠开头) | 类内可见(类的方法定义中可使用self) |
私有属性的暴露:python的getter和setter, 使用property函数
(1) property装饰器(可以像访问属性一样 点取 暴露私有属性的函数, 效果等同于访问私有属性)
class C(object):
def __init__(self, x):
self.__x = x
@property
def x(self):
return self.__x
# 对函数使用了property装饰器后,会产生" 函数同名.seterr " 的装饰器
@x.setter
def x(self, value):
self.__x = value
@x.deleter
def x(self):
del self.__x
def __str__(self):
return f"Private Attribute x: {self.__x}"
# call
if __name__ == "__main__":
c = C("x1")
print(c, c.x, sep=" / ")
c.x = "x2"
print(c, c.x, sep=" / ")
del c.x
# print(c)
# 报错(慎用x.deleter装饰器, 只需知道有这个概念): AttributeError: 'C' object has no attribute '_C__x'
(2) property调用构造:
class D(object):
def __init__(self, y):
self._y = y
def get_y(self):
return self._y
def set_y(self, v):
self._y = v
# property构造, 先get, 后set
y = property(get_y, set_y, "Exposed Protected Attribute: y")
# call
if __name__ == "__main__":
# 实例化一个类,创建一个对象,python不使用new关键字
d = D("y1")
print(d.y)
d.y = "y2"
print(d.y)
二、内置类方法:
内置方法 | 说明 |
---|---|
_init_(self,…) | 初始化对象(成员变量),在创建新对象时调用 |
_new_(cls,*args,**kw) | 在_init_()之前被调用,用于生成实例对象 |
_del_(self) | 析构函数,释放对象,对象清理 |
_str__(self) | 直接输出(print)一个对象 / java.toString() |
_eq_(self, right): | 对象实例是否相等规则定义,默认比较对象的地址 / java.equals() |
_call_(self,*args) | 把实例对象作为函数调用;有点回调那意思,是类留给其他接口的直接调用; 可以做的事(很多…): (1) 可以根据参数,返回不同的类的实例 (根据不同指令产生同一对象的不同行为); (2) 根据自身属性构造其他对象返回; |
详细使用见:内置类方法示例