在没学习 Python之前,我们经常听说它是面向对象的,他是怎么体现的呢?要想学好python这个技术,掌握类的建立和使用肯定是学好python的关键之一。
我们先看看怎么建立类,知道怎么建,才好去用吧。
class MyClass:
pass
我们看到class 打头,这是不是和其他的编程语言有相似的地方,不过这里不用{}号哦,不过它对齐有严格的规定要求。
上面我们建立了一个MyClass一个新类,那么我们怎么使用呢?
如下:
obj = MyClass()#在类的后面加上括号,这样我们就实例化了
我们学会了创建类,在生活中,发现很多有共同的东西,比如猫,狗、牛都能叫,眼睛、鼻子等等。我们是不是可以不一一创建,我们是不是可以设置一个类,然后其他的类稍微修改下,比如牛的叫声和猫的不一样,但都是叫。这里就是我们说的继承。
那么新的类怎么写呢:
class SubClass(MyClass):
pass
我们把MyClass放到新类的后面用括号包起来,SubClass就继承了它。
你说是,我怎么知道就继承了呢。
我们可以用这个isinstance()函数来判断下是否属于某个类或其子类
obj = SubClass()
if isinstance(obj, MyClass):
print("该对象是MyClass的子类")
我们通过IF来判断了下,上图看,很明显我们是创建没有任何问题,确实是myclass的子类。
那也有脑子转的快的同学,那创建一个大象,大象用鸡的眼睛、用狗的叫声、猴子的尾巴是不是也行...
当然可以,这么一来就要同时继承多个了,在编程世界里,这就叫多重继承。
要这么实现呢,我们可以括号中写上所有的你想要继承的类,记得要逗号分开,不能它认不出来的哦。
这样:
class Derived(Base1, Base2):
pass
同时继承了base1 和2。
我们通过上面,我们很快就知道了怎么创建,和应用的。但是这些太简单了,没有什么功能,
我们接下来就了解一下类里面是怎么实现我们的想要完成的事的。
下面用这个 __init__()方法,初始化对象属性:
class Vehicle:
def __init__(self, name):#初始
self.name = name#动作1
class Car(Vehicle):#这个类没设置什么功能
pass
car = Car("宝马")#我调用car这个类
print(car.name) # 神奇的事输出"宝马",这个是Vehicle干的活
有些厉害的朋友、同学,我感觉这个类功能还达不到我的想要的,我还有其他的想法,能不能加进去。
当然可以,你可能比你的父母多学了一门技能,因为他们花前供我们读书学本身了,那你就开始重写基类。
那怎么去重写呢
子类可以选择重写基类的方法。例如,覆盖move()方法:
class Vehicle:
def move(self):
print(f"{self.name}正在移动。")
class Car(Vehicle):
def __init__(self, type):
self.type=type
super().__init__()
def move(self):
print(f"{self.type}正在快速移动。")
car = Car("宝马")
car.move() # 输出"宝马正在快速移动。"
我们看到子类和父类 ,输出有点不一样。一个只是告诉在移动,在子类中是快速移动
到现在很多人就会产生疑问了,这是我自己写的方法,那别人写的方法,我怎么知道什么功能,我不能乱调用。
那么我们只要掌握怎么去查看方法有什么属性
使用dir()来
car = Car("宝马")
print(dir(car)) # 列出car对象的属性,包括继承自Vehicle和Car中的内容。
一些特殊方法的使用:
定义__str__()或__repr__()方法,在打印时显示友好的信息
class Example:
def __init__(self, description):
self.description = description
def __str__(self):
return f"This is an example: {self.description}"
obj = Example("示例")
print(obj) # 输出"This is an example: 示例"
我们访问的时候,通过使用private和protected属性(前缀 _ 表示)加了就受保护了,只能类中、子类访问了。不加就是public类外都可以访问。
class Example:
def __init__(self):
self._data = 42
obj = Example()
print(obj._data) # 输出42
如果一个分类和另一个基类有相同的方法名,子类继承时可能会出现冲突。可以我们可以重写或保留其中一个:如果不做什么,那就优先使用第一个父类的方法。
class Base1:
def do_something(self):
print("Base1中的方法被调用。")
class Base2:
def do_something(self):
print("Base2中的方法被调用。")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.do_something() # 输出"Base1中的方法被调用。"(由于优先考虑最后继承的类)
通过以上内容,你是不是已经理解了雷达继承,那就开始吧。