python类 您所在的位置:网站首页 python定义类的关键字 python类

python类

2023-12-14 23:57| 来源: 网络整理| 查看: 265

python类对象 一、要点回顾(python对象) 1.1、python对象基础知识

Python是一门面向对象(object)的语言,一切皆对象!

程序运行当中,所有的数据都是存储到内存当中然后再运行的!

对象就是内存中专门用来存储指定数据的一块区域

对象实际上就是一个容器,专门用来存储各种数据(比如:数字、布尔值、代码)

对象由三部分组成:

对象的标识(id) id用来标识对象的唯一性,每一个对象都有唯一的id(相当于人的身份证号)id是由解析器生成的,在CPython中,id就是对象的内存地址,对象一旦创建,则它的id永远不能再改变可以通过id()函数来查看对象的id 对象的类型(type) 类型用来标识当前对象所属的类型,比如:int str float bool…类型决定了对象有哪些功能,python是一门强类型的语言,对象一旦创建类型便不能修改可以通过type()函数来查看对象的类型 对象的值(value) 值就是对象中存储的具体的数据有些对象的值可以改变(可变对象),有些对象的值不可以改变(不可变对象)

对象与变量

对象并没有直接存储到变量中,在python中变量更像是给对象起了一个别名变量中存储的不是对象的值,而是对象的id(内存地址) 当我们使用变量时,实际上就是在通过对象id在查找对象 变量中保存的对象,只有在为变量重新赋值时才会改变变量和变量之间是相互独立的,修改一个变量不会影响另一个变量 1.2、面向对象编程 python是一门面向对象的编程语言,简单理解就是语言中的所有操作都是通过对象来进行的面向过程的编程的语言 面向过程的编程思想将一个功能分解为一个一个小的步骤,通过完成一个一个的小的步骤来完成一个程序例子: 孩子上学 1.妈妈起床 2.妈妈洗漱 3.妈妈做早饭 4.妈妈叫孩子起床 5.孩子上厕所 6.孩子要洗漱 7.孩子吃饭 8.孩子背着书包上学校 优点:符合思维惯性,编写起来相对比较简单缺点:复用性比较低,并且难于维护(往往只适用于一个功能,如果要实现别的功能,即使功能相差极小,也要重新编写代码) 面向对象的编程语言 面向对象的编程语言,关注的是对象,而不关注过程例子: 孩子上学 1.妈妈起床叫孩子上学 面向对象的编程思想,将所有的功能统一保存到对应的对象中 妈妈功能保存到妈妈的对象中,孩子的功能保存到孩子对象中,要使用某个功能,直接找到对应的对象即可 优点:容易阅读,并且比较易于维护,容易复用缺点:不太符合常规的思维,编写起来稍微麻烦 二、python类 2.1、类简介及定义方式 2.1.1、类中的属性及方法

常用的对象都是Python内置的对象

# int() float() bool() str() list() dict() .... 这些都是类 a = int(10) # 创建一个int类的实例 等价于 a = 10 print(type(a)) #

但是内置对象并不能满足所有的需求,经常需要自定义一些对象**(根据类创建对象)**

类就是对象的图纸!对象是类的实例(instance)类也是一个对象!类是一个用来创建对象的对象!

类的定义方式,使用class关键字

在定义类时,可以定义变量(属性)和函数(方法)

类属性:在类中定义的变量,是公共属性,

访问:类属性可以通过类或类的实例访问到(对象.属性名)修改:类属性只能通过类对象来修改,无法通过实例对象修改

实例属性:通过实例对象添加的属性属于实例属性(在init()方法中定义)

实例属性只能通过实例对象来访问和修改(对象.属性名),类对象无法访问修改

方法:在类中定义的函数(方法),可以通过该类的所有实例来访问(对象.方法名())

实例方法:在类中定义,以self为第一个参数的方法都是实例方法

实例方法在调用时,python会将调用对象作为self传入实例方法可以通过实例和类去调用 当通过实例调用时,会自动将当前调用对象作为self传入当通过类调用时,不会自动传递self,此时我们必须手动传递self

类方法:在类内部使用 @classmethod 修饰的方法(装饰器,详见3.1.2)

类方法的第一个参数是cls,也会被自动传递,cls就是当前的类对象 实例方法的第一个参数是self,而类方法的第一个参数是cls类方法可以通过类去调用,也可以通过实例调用,没有区别

静态方法:在类中使用 @staticmethod 修饰的方法

静态方法不需要指定任何的默认参数,可以通过类和实例去调用静态方法,基本上是一个和当前类无关的方法(常作为工具方法),它只是一个保存到当前类中的函数

方法示例见2.3.2

类中方法的self形参说明:

方法调用时,第一个参数由解析器自动传递,所以定义方法时,至少要定义一个形参!

在方法中不能直接访问类中的属性(包括公共属性)

2.1.2、类的定义 # 我们自定义的类都需要使用大写字母开头,使用大驼峰命名法(帕斯卡命名法)来对类命名 class 类名(父类) : # 默认继承object类,可不写 # 公共属性 public_attribute = '' # 对象的初始化方法(非必要,通常会有该方法) def __init__(self,...): pass # 其他的方法 def method_1(self,...): pass def method_2(self,...): pass """ 练习:尝试自定义一个表示狗的类(Dog) 属性: name age 方法: jiao() run() """ class Dog(object) : # 主人姓名 owner = 'qy' # 对象的初始化方法 def __init__(self, name, age): self.name = name self.age = age # 其他的方法 def jiao(self): print("汪汪汪") def run(self): print("跑") # 在方法中访问类的属性 def say_hello(self): print("你好,%s" % self.owner) 2.2、使用类创建对象 2.2.1、创建对象

使用类创建对象与调用函数的方式类似,对象名 = 类名(“用于初始化的参数”)

创建一个变量(对象名)在内存中创建一个新对象(类的实例),如果有init(self)方法则执行将对象的id赋值给变量 dog1 = Dog("xiaobai", 3) print(dog1.owner) # qy print(dog1.name) # xiaobai dog1.name = "xiaohei" print(dog1.name) # xiaohei dog1.jiao() # 汪汪汪 dog1.run() # 跑 dog1.say_hello() # 你好,qy dog2 = Dog("dahuang", 2)的运行流程 dog2.jiao() # 汪汪汪 # 方法每次被调用时,解析器都会自动传递第一个实参(调用方法的对象本身)给self, # 如果是dog1调的,则第一个参数就是dog1对象 # 如果是dog2调的,则第一个参数就是dog2对象

使用isinstance()检查一个对象是否是一个类的实例

flag = isinstance(dog1, dog) # true flag = isinstance(dog1, int) # false 2.2.2、设置及访问对象属性

没有init(self)函数时,可以直接设置并修改对象的属性(不建议)

# 也就是对象中实际上什么都没有,就相当于是一个空的盒子 # 可以向对象中添加变量,对象中的变量称为属性(对象.属性名 = 属性值) class MyClass(): pass mc1 = MyClass() result = isinstance(mc1, MyClass) # true print(id(mc1), type(mc1)) # 2841238613072 print(id(MyClass), type(MyClass)) # 2841239528544 mc1.name = '孙悟空' print(mc1.name) # 孙悟空 mc1.name = '猪八戒' print(mc1.name) # 猪八戒 # 手动给类的对象添加、修改属性容易出现错误,且不够清晰,不容易记忆 # 如果明确类的对象必须有nam,则可以将该属性设置到初始化函数中,即init(self, name),在创建对象时,必须设置name属性,如果不设置对象将无法创建 # class MyClass(): # def __init__(self, name): # # 通过self向新建的对象中初始化属性 # self.name = name # mc2 = MyClass("唐僧")

类对象和实例对象中都可以保存属性(方法)

如果这个属性(方法)是所有的实例共享的,则应该将其保存到类对象中

如果这个属性(方法)是某个实例独有,则应该保存到实例对象中

一般情况下,属性保存到实例对象中,而方法需要保存到类对象中

属性和方法查找的流程

当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性如果有,则直接返回当前的对象的属性值如果没有,则去当前对象的类对象中去寻找 如果有则返回类对象的属性值如果类对象中依然没有,则报错! 2.3、类的特殊方法 2.3.1、特殊方法

在类中可以定义一些特殊方法(魔术方法)

特殊方法都是以__开头,__结尾的方法特殊方法一般不需要自己调用(不建议手动调用),特殊方法将会在特殊的时刻自动调用_init_()是常用的特殊方法 创建对象时执行,创建以后结束执行(可以用来对新创建的对象初始化属性)创建对象的流程:dog1 = Dog(“xiaobai”, 3) 创建一个变量dog1在内存中创建一个新对象(Dog实例)_init_(self)方法执行将对象的id赋值给dog1

其他特殊方法

# 定义一个Person类,默认继承Object类 class Person(): """人类""" def __init__(self, name , age): self.name = name self.age = age # object.__str__(self) # 会在尝试将对象转换为字符串的时候调用 # 它的作用可以用来指定对象转换为字符串的结果(print函数) # 相当于方法重写 def __str__(self): return 'Person [name=%s , age=%d]'%(self.name,self.age) # object.__bool__(self) # 可以通过bool来指定对象转换为布尔值的情况 def __bool__(self): return self.age > 17 # object.__gt__(self, other) 大于 # 需要两个参数,一个self表示当前对象,other表示和当前对象比较的对象 def __gt__(self , other): return self.age > other.age # 创建两个Person类的实例 p1 = Person('孙悟空',18) p2 = Person('猪八戒',28) # 打印p1 # 当我们打印一个对象时,实际上打印的是对象的中特殊方法 __str__()的返回值 print(p1) # Person [name=孙悟空 , age=18] print(bool(p1)) # True if p1: print(p1.name,'已经成年了') else: print(p1.name,'还未成年了') print(p1 > p2) # False print(p1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有