欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python学习笔记:python中的类

程序员文章站 2022-06-16 21:22:52
...

1.类(class)的简单介绍

  • 内置对象:python中提供的对象。官网:https://docs.python.org/3/library/index.html
  • 内置对象并不能满足所有需求,所以在开发中经常需要自定义一些对象。
  • 简单理解:对象是一个容器,类是对象的图纸。也称,对象是类的实例(instance)。
  • 如果多个对象是通过一个类创建的,我们称这些对象是一类对象
  • 常见的类:int()、float()、bool(),str(),dict()等都属于类
  • a=int(10) #创建一个int类的实例,等价于 a=10
  • 系统内置的类都是小写开头,我们自定义的类都需要大写字母开头,使用大驼峰命名法(帕斯卡命名法)
a=int(10) #创建一个int类的实例
b=str('hello') #创建一个str类的实例
print(a,type(a)) #查看变量的类
print(b,type(b))
10 <class 'int'>
hello <class 'str'>

2.自定义一个类

  • 使用class关键字来定义类,语法和函数很像!
  • 定义方式为:
    class 类名([父类]):
    代码块
#class 类名([父类]):  
#  代码块

class MyClass():
    pass

print(MyClass)
<class '__main__.MyClass'>

3.检查一个对象是否是一个类的实例:isinstance()

mc=MyClass()
result=isinstance(mc,MyClass)
print('result=',result)
result= True
result=isinstance(mc,str)
print('result=',result)
result= False

4.类也是一个对象。类是创建对象的对象—PPT

如何证明类是对象?对象的结构:id,type,value
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8Nvz1aX-1584151216682)(attachment:image.png)]

print(id(MyClass),type(MyClass))
2566220227480 <class 'type'>

类是type类型的对象。定义类=定义了一个type类型的对象。一切皆对象!!!

5.使用类创建对象的流程

使用类创建对象,就像调用函数一样

  • 创建一个变量mc
  • 在内存中开辟一个空间–对象有了id,对象的type就是类,value看情况
  • 将对象的id赋值给变量
    由于MyClass是空的,所以通过MyClass创建的对象都是一个空对象。实际上对象中什么都没有,空盒子。
    空盒子有什么用?空盒子可以添加变量。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V76XI7Er-1584151216684)(attachment:image.png)]
class MyClass():
    pass
mc=MyClass() 
print(id(mc),type(mc))
2227538359520 <class '__main__.MyClass'>

5.1可以向对象中添加变量,对象中的变量称为属性。

语法:对象.属性名=属性值

mc.name="孙悟空"
print(mc.name)
mc.time=20191121
print(mc.time)
孙悟空
20191121

一般情况下,不会创建一个空的类,再想放什么属性就放什么。因为类是图纸,对象是实例。

6.类的定义

  • 类和对象都是对现实生活中或程序中内容的抽象。
  • 类不能凭空创造,刚才定义的MyClass是为了便于理解定义的空的类。实际上是在生活和程序中都不存在
  • 实际上所有的事物都由两部分组成:1.数据(属性) :身高体重等 ;2.行为(方法):走跑跳等

6.1属性:

  • 在类的代码块中,我们可以定义变量和函数
  • 在类中定义的变量,称为属性
  • 在类中定义的变量,成为该类实例的公共属性,该类的所有实例都可以通过“对象.属性名”的形式访问这些属性
#定义一个表示人的类
class Person:
    name='孙悟空'#公共属性,所有实例都可以访问

#创建Person的实例
p1=Person()
p2=Person()

print(id(Person),type(Person))
print(id(p1),type(p1),p1.name)
print(id(p2),type(p2),p2.name)
2227517622680 <class 'type'>
2227538486552 <class '__main__.Person'> 孙悟空
2227538486832 <class '__main__.Person'> 孙悟空

6.2 方法:

  • 在类中定义的函数,称为方法
  • 在类中定义的函数,成为该类实例的公共方法,该类的所有实例都可以通过“对象.方法名()”的形式调用方法
  • 调用方法:对象.方法名()
#定义一个表示人的类
class Person:
    name='孙悟空'
    def say_hello():
        print('你好!')      
#创建Person的实例
p1=Person()
p2=Person()
#调用say_hello方法
p1.say_hello()
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-28-3dafb7c1b2d4> in <module>
      8 p2=Person()
      9 #调用say_hello方法
---> 10 p1.say_hello()


TypeError: say_hello() takes 0 positional arguments but 1 was given

6.2.1方法调用与函数调用的区别:

  • 函数调用,则调用时传几个参数就会有几个实参
  • 方法调用,第一个参数由解析器自动传递,所以定义方法时,至少要定义一个形参!!!!!

修改:给say_hello方法定义一个形参a

#定义一个表示人的类
class Person:
    name='孙悟空'
    def say_hello(a):
        print('你好!')      
#创建Person的实例
p1=Person()
p2=Person()
#调用say_hello方法
p1.say_hello()
p2.say_hello()
你好!
你好!

6.3 为什么实例可以访问类中的方法和属性?

  • 属性和方法的查找流程:
    当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性。
    若有,则直接返回当前对象的属性值;若没有,则去当前对象的类对象中寻找,如果有则返回类对象的属性;没有则报错