
文章目录类和对象类的定义和使用方法魔术方法类和对象类: 描述的是一组具有相同属性(特征) 和 方法 (功能/行为) 的模版对象; 对象是类的实例, 是基于类创建出来的(实例对象)类的定义和使用语法:class类名:类的属性 类的行为# 创建对象对象名类名()对象名.属性名1属性值 对象名.属性名2属性值class 关键字, 表示定义类类的属性: 定义在类中的变量 (成员变量)类的行为: 定义在类中的函数 (成员方法)classStudent:nameNoneageNonedefsay_hello(self):print(f我是{self.name})stu1Student()stu1.nameJohnstu1.say_hello()# 我是 John可以看出, 类中不仅可以定义属性类记录数据, 也可以定义函数来记录行为其中, 类中定义的属性 (变量), 我们称之为成员变量类中定义的行为 (函数), 我们称之为:成员方法说明: 类的命名规范: 遵循大驼峰命名法, 每个单词的首字母都是大写, 单词之间没有分隔符, 例如:UserInfo, UserAccount说明:__dict__是python中用户自定义类实例的一个特殊属性, 用于以字典的形式存储对象的属性print(对象名.__dict__)以字典的形式输出属性classCar:passc1Car()c1.colorredc1.brandBMWc1.pirce5777print(c1)# __main__.Car object at 0x10186dfd0print(c1.__dict__)# {color: red, brand: BMW, pirce: 5777}方法定义在类的外面的称为函数, 定义在类中的函数称为方法在类中定义成员方法和定义函数基本一致, 但仍有细微区别:def方法名(self,形参1,......,形参N):方法体可以看到, 在方法定义的参数列表中, 有一个: self 关键字self 关机字是成员方法定义的时候,必须填写的,它用来表示类对象自身的意思当我们使用类对象调用方法的时候, self 会自动被python 传入在方法内部, 想要访问类的成员变量, 必须使用 selfself 关键字, 尽管在参数列表中, 但是传参的时候可以忽略它例如:classStudent:nameNoneageNonedefsay_hello(self):print(f我是{self.name})defprint_mag(self,msg):print(msg)stu1Student()stu1.nameJohn# 调用的时候无需传参stu1.say_hello()# 调用的时候只需要传msg参数stu1.print_mag(massage)构造一个闹钟类classClock:idNonepriceNonedefring(self):importwinsound winsound.Beep(2200,3000)clock1Clock()clock1.id101clock1.price19.9print(clock1.id)clock1.ring()通过 ring() 方法就可以让电脑发出声音了魔术方法魔法方法是指python中提供的以双下划线开头和结尾的方法, 用于定义类的特殊行为, 例如:__init____init__方法是在对象创建的时候自动调用的, 借此特性可以给成员变量赋值classStudent:nameNoneageNonedef__init__(self,name,age):self.namename self.ageage stu1Student(John,18)print(stu1.__dict__)# {name: John, age: 18}注意:构造方法__init__前后都有两个下划线构造方法也是成员方法, 不要忘记在参数列表中提供 self在方法内部使用成员变量需要使用 self上面讲到的__init__方法是python内置的方法之一, 这些内置的方法, 各自有各自的特殊功能, 这这些内置的方法我们称之为: 魔术方法魔术方法不需要我们手动调用, python会在合适的时机自动调用魔术方法描述__init__初始化方法__str__字符串表示的方法__eq__比较两个对象是否相等equal__lt__、__le__、__gt__、__ge__支持比较两个对象的大小小于、小于等于、大于、大于等于classStudent:nameNoneageNonedef__init__(self,name,age):self.namename self.ageagedef__str__(self):returnf类对象:{self.name}{self.age}stu1Student(John,18)print(stu1)# 类对象: John 18提供了__str__方法之后再执行print(stu1), 就不会打印再内存地址了默认自定义的对象之间不可以进行大小比较classCar:def__init__(self,name,price):self.namename self.pricepricedefrunning(self):print(f{self.name}is running)def__str__(self):return(f{self.name}的价格为{self.price})def__eq__(self,other):returnself.nameother.nameandself.priceother.pricedef__lt__(self,other):returnself.priceother.price不实现__eq__方法, 对象之间可以比较, 但是比较的是内存地址, 即; 不同对象 比较一定是 False实现了__eq__方法, 就可以按照自己的想法来决定 2 个对象是否相等了