初始Python面向对象概念(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/82390576

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游戏
>>>玩王者

猜你喜欢

转载自blog.csdn.net/qq_39591494/article/details/82390576
今日推荐