zoukankan      html  css  js  c++  java
  • python类和函数拾遗——继承、bif(内置函数)、property

    函数在创建时有一些内置的方法,特殊情况下会使用到。一般被称为魔法方法

    在此之前先记录一下类的进阶方法:

    一、继承

    class Fish():
    def __init__(self):
    self.x = random.randint(0,10)  
    def hello(self): print("Hello! I am a fish!I'm gonging to{}".format(self.x-1)) class Shark(Fish):
    def __init__(self):
    super().__init__()
    self.y = random.randint(0,10)
    def eat(self): print("鲨鱼吃各种鱼,还有一个y轴属性,我在y={}".format(self.y))

    这样子的话如果shark1 = Shark()     我们调用shark1.hello() 会怎样呢?

    shark1 = Shark()
    shark1.hello()
    
    >>Hello! I am a fish!I'm going to 4

     ※ 注意这里我们用super().__init__() 来继承父类的初始化方法(init)   

    ※  一般继承是一对一的,尽量不使用多继承,但是有时候需要多继承:例如飞机继承于交通工具,但是又有“飞”的特殊属性,我们创建四轴飞行器,飞机,直升机类的时候都单独写一个飞属性,那么代码的复用性就太差了。这时候可以用

    class PlaneMixin:
        def fly(self):
            print("I'm flying!")

    用Mixin来增加一个功能,这个类只作为功能添加

      ●不能作为父类,不能使某个物品。

      ●必须责任单一,如果有多个功能就写多个Mixin类

      ●它不依赖于子类的实现

      ●子类即使没有继承这个Mixin类也可以照常工作,只是没有了这个功能。

    ★python3里的类都是新式类,继承的时候是广度遍历(深度遍历后将重复的项删掉,只保留最后一个,也就相当于广度遍历) 顺序可以用 类.__mro__查询

     

    二、组合

    把没有关系的类放在一起就是组合,可以放在新的类里面一起初始化

    class Turtle:
        def __init__(self, x):
            self.num = x
    
    
    class Fish:
        def __init__(self,y):
            self.num = y
    
    
    class Pool:
        def __init__(self, x, y):
            self.turtle = Turtle(x)
            self.fish = Fish(y)
    
        def print_num(self):
            print("水池里有{}乌龟,{}条鱼".format(self.turtle.num, self.fish.num))
    
    
    pool1 = Pool(5,7)
    
    pool1.print_num()
    
    >>  水池里有5乌龟,7条鱼

    三、类A,类对象A(),实例化对象a = A()

     查询类里面所有的字段可以用A.__dict__

    但是实例化对象如果没有填参数就查询不到,例如a.__dict__就是空的

    四、内置函数(bif)

    1、issubclass,查询前面的类是否是后面类的子类,默认自己是自己的子类,所有的类都是object类的子类

    class A:
        pass
    
    class B(A):
        pass
    
    print(issubclass(B, A))
    >>>True

    2、isinstance, 检查一个实例化对象是不是属于一个类,第二个参数可以传入一个元组(里面有多个候选类) 【如果第二个参数不是由类组成,会抛出一个TypeError的异常】

    b1 = B()
    print(isinstance(b1, B))
    >>>True
    print(isinstance(b1, A))
    >>>True
    print(isinstance(b1, (A, B, C)))
    >>>True

    # 这里B是继承自A的所以b1也是A的实例化对象

    3、hasattr(object, name) 测试一个对象里面是否有指定的属性,attr是attribute的缩写,属性的意思

    class C:
        def __init__(self, x=0):
            self.x = x
    
    
    c1 = C()
    print(hasattr(c1, 'x'))  # 这里属性名是字符串
    >>> True

    4、getattr(object, name[, default]) 获得一个对象里面的指定属性的值(默认值),也可以通过default来设定返回值

    class C:
        def __init__(self, x=0):
            self.x = x
    
    c1 = C()
    print(getattr(c1, 'x'))
    # 返回0
    print(getattr(c1, 'y', None))
    # 没有返回默认值None,(这里的default是位置参数,不能写成key=None形式)

    5、 setattr(object, name, value) 给一个属性赋值,例如上面没有‘y’属性,可以给它设定上一个y属性

    setattr(c1, 'y', 'NewValue')
    getattr(c1, 'y')
    >>> 'NewValue'

    6、delattr(object, name) 删除一个属性

    五、魔法方法,property

    property赋值给x后,可以通过x来调用属性,里面前三个参数分别是:获取属性的方法,设置属性的方法,删除属性的方法

    class C:
        def __init__(self, size=10):
            self.size = size
    
        def get_size(self):
            return self.size
    
        def set_size(self, value):
            self.size = value
            return '设置成功'
    
        def del_size(self):
            del self.size
    
        x = property(get_size, set_size, del_size)
    '''property参数:fget=None,fset=None,fdel=None,doc=None'''
    
    c1 = C()
    print(c1.get_size())
    print(c1.x)
    c1.x = 19
    print(c1.x)
    print(c1.get_size())
    del c1.x
    print(c1.get_size())
    
    '''
    10
    10
    19
    19
    Traceback (most recent call last):
      File "C:/Users/wqk/Desktop/OnlinePay/Pay/test_2.py", line 26, in <module>
    
        print(c1.get_size())
      File "C:/Users/wqk/Desktop/OnlinePay/Pay/test_2.py", line 7, in get_size
        return self.size
    AttributeError: 'C' object has no attribute 'size'
    '''

  • 相关阅读:
    Wiin10 深色模式 暗色 省电 经济 护眼dark mode energy saving ecol
    云主机终端现实中文
    systemctl enable与systemctl start的区别
    centos技巧
    用国内的vps登录亚马逊的ec2
    小米 redmi note 8 打开开发者选项
    javascript数组、对象和Null的typeof同为object,区分解决办法
    组件中是否可以判断slot是否有内容?
    xlsx-style 行高设置
    修改xlsx-style 源码 解决报错
  • 原文地址:https://www.cnblogs.com/djflask/p/12258067.html
Copyright © 2011-2022 走看看