Python之面向对象
一切万物皆为对象!
- 类:可以当做是一个模板,包含通用的特征和行为
- 对象:某一个具体的元素,类的实例化。就是一个对象。
- 对数据的操作一种更高级的抽象。
一、什么叫做抽象?
从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
1.1、抽象的定义
抽象是通过分析与综合的途径,运用概念在人脑中再现对象的质和本质的方法,分为质的抽象和本质的抽象。分析形成质的抽象,综合形成本质的抽象(也叫具体的抽象)。作为科学体系出发点和人对事物完整的认识,只能是本质的抽象(具体的抽象)。质的抽象只能是本质的抽象中的一个环节,不能作为完整的认识,更不能作为科学体系的出发点
二、Python面向对象
对象--->是某一个具体的物体,或者说一种元素它是具有(独特属性和行为的)我们可以称为对象。
例如:
地球,月亮,火星 | 星球 |
车,飞机,火箭,马,坦克,高铁 | 交通工具 |
自行车,跑车,三轮车,小轿车 | 车 |
男人,女人 | 人 |
python编程,java编程,php编程.... | 编程 |
某一个对象 | 类 |
在上面的表格中可以很清晰的看清楚,类与对象的区别,例如:我说“星球“ 这就是一个类,那么星球里面有很多的球,例如地球,这里就可以理解为地球就是一个对象。
三、如何定义一个类
3.1、python中类的语法结构如下:
class 类的名称: 缩进加内容
3.2、实例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "YanZanG"
class Car: #---->定义了一个名字叫做Car的类以:结尾
"这是一个汽车的类"
def __init__(self, name, model): # __init__初始化方法,
self.name = name # 类的属性,也就是特点,特征
self.model = model
def run(self): # 不同的方法,可以称为函数,method function
print(f"{self.name}汽车,配置是{self.model}开始跑起来啦!!!") # 行动!!!
T = Car("奥迪","A8L") # 类的实例化
T.run() # Car类中的run的方法
>>>奥迪汽车,配置是A8L开始跑起来啦!!! # 输出结果
不专业解释:
首先第一行定义了 class Car: 需要注意的是C是大写 每一个类的名称首字母必须大写。 >> 可以理解为,创建了一个汽车的类。
def __init__(self, name, model): 这是一个初始化方法,可以理解为:def zhangsan(xxx) 我们调用函数时候zhangsan("zzz")一个道理,也就是这个类生成实例的时候必须传2个参数进去,这里的self代表着实例的本身,后面再说。
- self.name = name
- self.model = model
以上的self.xxx = xxx 是类的属性,例如QQ飞车里面的赛车它是有属性的:进气,引擎,燃料,悬挂等...
def run(self):
print(f"{self.name}汽车,配置是{self.model}开始跑起来啦!!!")
在上面定义了两个属性为:self.name = name 后面的这个name就是实例化的时候传输进去的 在这里self.name = name 就可以理解为是一个变量而已,实例化后输入的参数--->传输到类中的name---->name在赋值给self.name 就这么自然。
若难理解如下:
name = input("请您输入一个数字:")
self_name = name
print(self_name)
>>>请您输入一个数字:1000000
1000000
最后一句很好理解了,车能干啥啊? 能吃吗 那肯定是能跑啊,所以定义了一个run函数,可以称之为方法,行为,它的动作,它能干啥。
def run(self):
print(f"{self.name}汽车,配置是{self.model}开始跑起来啦!!!")
使用f-string方法格式化输入,调用self.name self.model变量 输出结果
到这里可能会产生一种感觉,这玩意也没有那么复杂啊,好像都可以理解,确实那么一回事,接下来学习。变量。
- 私有变量
- 内部变量
通过方法修改私有数据,对数据进行保护。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "YanZanG"
class Car:
name = "yankerp"
def __init__(self, brand, price, wheels, power):
"""车子属性:品牌、价格、车轮、动力"""
self._brand = brand
self.price = price
self.wheels = wheels
self.power = power
self.__speed = 0
def run(self, action):
print(f"{self._brand}汽车开始跑起来啦!!!")
if action == "1":
self.__speed += 20
print(f"{self._brand}汽车已经加速,目前速度{self.__speed}Km/h")
def start(self):
print(f"{self._brand} is on 启动啦")
@property
def speed(self):
return self.__speed
@property
def brand(self):
return self._brand
@brand.setter
def brand(self, brand):
if not isinstance(brand, str):
raise TypeError("车牌是字符串类型啊")
self._brand = brand
@property
def info(self):
print(f"{self.brand}:{self.price}")
if __name__ == '__main__':
car = Car("奥迪", 500000, 4, "gasoline")
car.run("1")
car.start()
car.brand = "北京车牌"
car.info
@property装饰器用法参考:https://blog.csdn.net/qq_34802511/article/details/81367232
运行结果
奥迪汽车开始跑起来啦!!!
奥迪汽车已经加速,目前速度20Km/h
奥迪 is on 启动啦
北京车牌:500000
如果设置为汽车是数字如下:
if __name__ == '__main__':
car = Car("奥迪", 500000, 4, "gasoline")
car.run("1")
car.start()
car.brand = "北京车牌"
car.info
car.brand = "2018-奥迪"
print(car.brand)
car.brand = 190183
print(car.brand)
>>>
奥迪 is on 启动啦
北京车牌:500000
2018-奥迪
raise TypeError("车牌是字符串类型啊")
TypeError: 车牌是字符串类型啊
以上的提示来自:
@property
def brand(self):
return self._brand
@brand.setter
def brand(self, brand):
if not isinstance(brand, str):
raise TypeError("车牌是字符串类型啊")
self._brand = brand
3.3、Python中的isinstance用法
在以上例子中有一段代码如下:
def brand(self, brand):
if not isinstance(brand, str):
raise TypeError("车牌是字符串类型啊")
self._brand = brand
if not isinstance(brand, str) # 表示brand 是不是 str 字符串
例如:
result = isinstance(car, Car) # isinstance car Car car这个对象是不是Car这个类的实例。
print(result)
>>>True # 是的话返回True 不是的话 返回False
3.4、Python中,对象可以动态添加属性。 什么意思?
car.your_name = "zhangsan"
print(car.your_name)
>>>zhangsan
在类Car中在生成一个实例对象,这个新的实例对象是没有your_name 这个方法的。如下:
T1 = Car("宝马",800000,4,"gasoline")
print(T1.your_name)
>>>AttributeError: 'Car' object has no attribute 'your_name'
AttributeError: 'Car'对象没有属性'your_name'
查看car 和 T1 是否是Car的实例如下:
if __name__ == '__main__':
car = Car("奥迪", 500000, 4, "gasoline")
T1 = Car("宝马",800000,4,"gasoline")
car_result = isinstance(car, Car)
T1_result = isinstance(T1, Car)
print(car_result)
print(T1_result)
>>>
True
True
car和T1都是Car类的一个实例,但是car对象中动态定义了your_name = zhangsan 这个时候对这个类生成其他的实例是没有什么影响的。 但是不推荐这样去使用,这样很容易混乱。
四、类中的self是什么?
在搞self之前我查阅了几处文章,如下:
https://blog.csdn.net/daocaoren1543169565/article/details/80626035
https://www.cnblogs.com/lishuai0214/p/4283638.html
https://blog.csdn.net/qq_40736220/article/details/79477569
假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self的原理了
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "YanZanG"
class Computer:
def play(self, game="QQ游戏"):
print(f"玩{game}")
PC1 = Computer()
PC1.play()
Computer.play(PC1,game="王者")
>>>玩QQ游戏
>>>玩王者