python学习——oop

本文深入探讨Python面向对象编程(OOP)的关键概念,包括构造函数、super机制、property属性及常用魔术方法。通过实例讲解,帮助理解类的初始化、属性访问控制及特殊方法的运用。

 

这篇是我再学习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用来获取当前对象
  • 被设置的属性名义字符串的形式出现
  • 需要对属性名称设置的值

    不想说了,具体看这里还有这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值