🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
首先,我们需要明白一句话,在Python中,一切都是对象
单片机,嵌入式都是面向过程的
面向对象有封装,继承,多态的特性
而面向过程需要做底层开发,面向对象是有好多东西已经封装好了,直接用就可以了
比如说:
狗吃屎,这个是面向对象的,强调吃的对象。
吃狗屎,这个是面向过程的,强调吃的过程
类和对象
我们这篇文章主要说的是任何一门语言都必不可少的,极其重要的部分---类和对象
类是一个具有特殊功能的实体的集合,抽象的一个概念。
对象是一个具体的存在。
看上面的是不是感觉有点空,接下来,让我们在代码中感受一下。
首先,我们来定义一个空类。
# 1.空类
class MyClass1():
pass #对类的特征的描述,对类的行为的描述
class MyClass2():
pass
这个类中pass的位置,我们应该放的是对类的特征的描述,对类的行为的描述。
所以接下来,让我们创建一个非空类
# 2.非空类
def check():
print('check----start')
print('check----end')
而在非空类中,我们要进行的是对类的特征的描述或者对类的行为的描述。
对类的特征的描述,代表的是变量。
对类的行为的描述,代表的是函数。
我们来看下面的这个代码。
class MyClass3():
print('33333----start')
# 类体
# 0.对类的特征的描述:变量
num=10
name="zhangsan"
# 1.对类的行为的描述:函数
def show(self):
print("showing")
def func1(self):
print('111111')
print('33333---end')
需要注意的是,和函数相同的是,类中也会引入新的作用域,所以在类中定义的变量或者函数,在类外是不能直接访问的。
print(num)
print(func1)
比如说如果运行这个代码,是会报错的。报错内容如下:
NameError: name 'num' is not defined. Did you mean: 'sum'?
另外,我们也可以采用下面的这种方式来定义类
class MyClass3:
print('33333----start')
# 类体
# 0.对类的特征的描述:变量
num=10
name="zhangsan"
# 1.对类的行为的描述:函数
def show(self):
print("showing")
def func1(self):
print('111111')
print('33333---end')
上面是类的部分,接下来,我们说一下对象。
对象也被称为实例,创建对象也叫做实例化对象或者类的实例化。
语法:变量=类名()
比如说,我们来看下面的这个代码
class Person():
pass
p1 = Person()
print(p1) # <__main__.Person object at 0x000001E6FE0B7490>
print(id(p1))
p2 = Person()
print(p2) # <__main__.Person object at 0x000001E6FE0B74D0>
print(id(p2))
在这个当中,我们就创建了两个对象。
但是在这个类中,是没有定义构造函数的。
那么,如果定义了构造函数,会是什么样子的呢?
常见的构造函数:
__init__
当有构造函数后,当我们常见对象的时候,会自动调用构造函数。
class Animal():
# 构造函数之一:__init__,表示初始化,给对象初始化
# 注意:形如__xx__命名的函数,这种函数不需要手动调用,会在特殊的场景下自动调用
# __init__:当创建对象的时候,会自动调用__init__函数
# self:无需传参。会被自动传参,当创建对象的时候会被当前创建的对象自动传参给self,self:
# self: 表示当前对象
def __init__(self,name,age,kind): # self是a1和a2的地址
# print('init--------',id(self),name,age,kind)
# 语法:对象.变量=值,表示给当前对象进行特征的描述
self.name = name
self.age=age
self.kind=kind
构造函数中的self, 代表不需要我们传参,它会自动传参,当创建对象的时候会被创建的对象自动传参给self
也就是说,self表示的是当前的对象。
a1=Animal('小白',3,'猫') # a b c 来描述对象的特征
print('a1:',id(a1))
print(a1.name,a1.kind,a1.age)
a2=Animal(4,5,6)
print('a2:',id(a2))
如果不使用构造函数呢?
比如说下面的这个代码
class Animal():
pass
# 注意:创建对象的时候,需不需要传参,一定要和__init__函数匹配
a1=Animal()
a1.name='小白'
a1.age=3
a1.kind='猫'
print(a1.name,a1.age,a1.kind)
a2=Animal()
a2.name='bob'
a2.age=5
a2.kind='田园犬'
你看,这样相比较之下,下面的这个是不是很不方便。
类中的属性
类中的成员有变量和属性。变量我们上面说了,我们下面来说一下属性。
类中的属性一般分为两种,一种是类属性,一种是实例属性。
其中的类属性直接定义在类中。
实例属性是通过对象.属性=值的方式来定义。
我们来看下面的这一段代码
class Person():
# 类属性直接定义在类中,
place = '地球'
# 实例属性体现形式一、只要通过 对象.属性=值 语法定义的属性
def __init__(self,name,age):
self.name=name
self.age=age
p1=Person('小明',10)
p1.hobby='跳舞'
其次,访问方式不同
类属性可以通过类名或者对象来访问
实例属性只能通过对象访问
print(Person.place)
print(p1.place)
# 实例属性只能通过对象访问
print(p1.age)
print('*' * 50)
第三,访问优先级不同
当类属性和实例属性重名的时候,通过对象访问,优先访问的是实例属性
第四,使用场景不同
类属性是多个实例对象共有的属性,而实例属性是实例对象特有的属性。
p2=Person('xiaoming',10)
p3=Person('xiaoli',5)
print(p2.place,p3.place)
Person.place='火星'
print(p2.place,p3.place)
好了,我们这篇文章的内容就到这里,我们下次再见。