Python的面向对象、继承、多态和对象的消失与重生

面向对象的语言

众所周知,Python简单和面向对象的优点,所以也备受青睐。
首先是最简答的对象的创建实例

class Dog:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def sit(self):
        print(self.name.title() + " is now sitting.")

    def roll(self):
        print(self.name.title() + " rolled over!")

init是构造函数
创建类
self 传递给方法的是实例对象的本身
经过测试代码和结果如下

dog = Dog("小黑",3)
dog.sit()
dog.roll()
print("\n")

在这里插入图片描述

继承

# 方法的继承
class A:
    def __init__(self,x):
        self.x = x

    def hello(self):
        print("你好,我是A")

class B(A):
    def __init__(self,x):
        self.x = x

    def hello(self):    # 重写父类方法
        print("你好,我是B")

b = B(3)
b.hello()
print(b.x)
print(isinstance(b,A))      # 判断一个对象是否属于某个类
print(issubclass(B,A))
print("\n")

直接将父类对象写在将要继承类的参数里即可
在这里插入图片描述

多重继承
从前往后开始继承,当前面内容没有的时候,才开始继承后面的
但要注意的是,A和B之间不能有继承关系,否则会报错
且是按顺序继承A与B之间的方法变量等,当A没有了才会取B中继续继承
如果AB同时有相同的内容,那么继承的将是A的内容,因为按顺序继承

# class C(A,B):
#     pass
#
# c = C()

类使用的小tips

组合

class Turtle:
    def say(self):
        print("不积硅步无以至千里!")
class Cat:
    def say(self):
        print("喵喵喵~")
class Dog:
    def say(self):
        print("哎呦,牛逼啊")

class Garden:
    t = Turtle()
    c = Cat()
    d = Dog()
    def say(self):
        self.t.say()
        self.c.say()
        self.d.say()

g = Garden()
g.say()
print("\n")

在这里插入图片描述

通过创建最小类对象来模拟字典
亦或者可以通过传统字典来保存

class K:
    pass
k = K()
k.x = 250
k.y = "小甲鱼"
k.z = [1,2,3]
print(k.x,k.y,k.z)
print("\n")

在这里插入图片描述

使用super继承父类的同时进行初始化

class Car():
    pass
class ElectircCar(Car):
    def __init__(self,p):
        super.__init__()
        self.p = p

多态

class Shape():
    def __init__(self,name):
        self.name = name
    def area(self):
        pass

class Square(Shape):
    def __init__(self,length):
        super().__init__("正方形")
        self.length = length
    def area(self):
        return self.length * self.length

class Circle(Shape):
    def __init__(self,radius):
        super().__init__("圆形")
        self.radius = radius
    def area(self):
        return 3.14 * self.radius * self.radius

class Triangle(Shape):
    def __init__(self,base,height):
        super().__init__("三角形")
        self.base = base
        self.height = height
    def area(self):
        return self.base * self.height / 2

s = Square(5)
c = Circle(6)
t = Triangle(3,4)
print(s.name,s.area())
print("\n")

在这里插入图片描述

类内的私有变量

私有变量需要通过特定方法来进行修改,增加的数据安全性和保密性
私有变量,在定义变量名之前加上两段下划线即可,且使用get和set进行变量值的设置

class Private():
    def __init__(self,x):
        self.__x = x
    def set_x(self,x):
        self.__x = x
    def get_x(self):
        return self.__x

对象的消失与重生

对象的消失与del

class DelTest():
    def __init__(self):
        print("I am coming!")
    def __del__(self):
        print("I am done")
d = DelTest()
del d
print()

在这里插入图片描述
对象的重生,利用global

class D():
    def __init__(self,name):
        self.name = name
    def __del__(self):
        global x
        x = self
d = D("Lebron")
print(d)
print(d.name)
del d
print(x)
print()

在这里插入图片描述
由于最好不要过多地使用全局变量,容易出错
采用闭包的方式来使对象重生

class E():
    def __init__(self,name,func):
        self.name = name
        self.func = func
    def __del__(self):
        self.func(self)
def outter():
    x = 0
    def inner(y = None):
        nonlocal x
        if y:
            x = y
        else:
            return x
    return inner
f = outter()
e = E("小甲鱼",f)
print(e)
del e
g = f()
print(g)
print()

在这里插入图片描述
而关于闭包的知识,读者可以参见我的另一篇文章Python中的函数、闭包、装饰器、lambda表达式、生成器和递归

一些冷门小知识

使用dict来查询对象的所有属性
使用slots会限制类中变量的创建的个数和和空间,但也能大大提高效率
继承自父类的__slots__属性是不会在子类中生效的,不会再限制子类变量的添加,
但原有的__slots__会继承给子类

使用__new__方法,在实例对象之前(即super)进行拦截
在函数中传入的str是不能改变大小写的,但是使用new进行拦截就可以做到
注意python的拦截方法
这里感觉很冷门,就是记录一下以便以后谈起能够更知道

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原创小白变怪兽

帮助原创小白成为怪兽吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值