这篇是我再学习python-oop时的随手笔记,可能会比较乱
1. 构造函数
如果定义了构造函数,这实例化时使用构造函数,不查找父类构造函数,如果没定义,则自动查找父类构造函数,如果子类没定义,父类的构造函数带参数,则构造对象时的参数应该按父类参数构造。
2.super
super不是关键字,而是一个类,super的作用是获取MRO列表中的第一个类。在有些情况下(单继承),这个类就是父类,这样super和java中意义就是一样的了。
但是严格来说super并不是调用父类。先介绍下MRO列表:
Method Realtion Order 用来制作一个继承关系的列表,通过一个C3线性化算法来实现的。
MRO列表的制作原则:
1.子类永远在父类的前面
2.如果继承了多个父类,那么按照()中的顺序在列表中摆放
具体算法参见这里,我就不详细介绍了(多继承用的少,实际是我懒得看了,需要的时候再研究吧)
class Base(object):
def __init__(self):
print('enter base')
print('leave base')
class A(Base):
def __init__(self):
print('enter A')
super(A, self).__init__()
print('leave A')
class B(Base):
def __init__(self):
print('enter B')
super(B, self).__init__()
print('leave B')
class C(A, B):
def __init__(self):
print('enter C')
super(C, self).__init__()
print('leave C')
c = C()
print(C.__mro__)#输出mro列表情况
输出结果为:
enter C
enter A
enter B
enter base
leave base
leave B
leave A
leave C
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>)
3.property
property() 函数的作用是在新式类中返回属性值。
#property()案例
#x = property(fget,fset,fdel,doc)
'''
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值函数
doc -- 属性描述信息
'''
class Person():
def __init__(self):
self._name = "None"
def fget(self):
return self._name
def fset(self,name):
self._name = name.upper()
def fdel(self):
del self._name
name = property(fget,fset,fdel)
p1 = Person()
p1.name = "zhang"
print(p1.name)
del p1.name
p1.__dict__
'''
输出结果为:
ZHANG
{} p1里面的成员属性已经被删掉了
'''
#@property方法(效果一样)
#property 的 getter,setter 和 deleter 方法可以用作装饰器:
class Person(object):
def __init__(self):
self._name = None
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
@name.deleter
def name(self):
del self._name
p2 = Person()
p2.name = "zhang"
print(p2.name)
del p2.name
p2.__dict__
'''
输出为:
ZHANG
{} p2里面的成员属性已经被删掉了
'''
4.类中常用的魔术方法
魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发
魔术方法的统一特征是方法名被前后两个下划线包裹
操作类:
- __init__:构造函数
- __new__:对象实例化方法
- __call__:对象当函数使用的时候触发
- __str__:当对象被当做字符串使用的时候触发
- __repr__:返回字符串
class A():
def __init__(self,name = 0):
print("实例化调用")
def __call__(self):
print("我被调用了")
def __str__(self):
return "我被当字符串调用了"
a = A()
a()
print(a)
'''
实例化调用
我被调用了
我被当字符串调用了
'''
描述符相关:
__set__,__get__,__delete__,
属性操作相关:
- __getattribute__:在属性被访问时自动调用
- __getattr__:在属性被访问时而对象没有这样的属性是被调用
- __setattr__:试图给属性赋值时被调用
- __delattr__:试图删除属性时自动调用
参数:
- self用来获取当前对象
- 被设置的属性名义字符串的形式出现
- 需要对属性名称设置的值