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'
'''

 

posted @ 2020-02-03 23:38  gavincc  阅读(201)  评论(0编辑  收藏  举报