🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。 ### 定义类 * 在现实世界中,先有对象,再有类 * 在程序中,先定义(类),后使用类(用来产生对象) 在Python中程序中的类用class关键字定义,而在程序中特征用变量标识,技能用函数标识,因而类中最常见的无非是:变量和函数的定义 ``` class student(): school='CECT' def learn(self): print('is learning') def eat(self): print('is eating') def sleep(self): print('is sleeping') ``` 注意: * 类中可以有任意python代码,这些代码在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过`student.__dict__`查看 * 类中定义的名字,都是类的属性,点是访问属性的语法。 ### 直接操作类的属性 ``` student.school #查 student.school='qh' #改 student.name=1 #增 del student.name #删 ``` ### 类实例化为对象 ``` s1=student() s2=student() s3=student() ``` > 如此,实例化了三个对象s1、s2、s3,但现在这三者除属性相同,如果想让他们还有不同的熟悉,就要用到`__init__`来初始化 ### `__init__`初始化 注意:该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但一定不能有返回值 ``` class student(): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex ...... s1=student('noah',28,'男') print(s1.name,s1.age,s1.sex) #结果: noah 28 男 ``` >也可以先调用类产生空对象s1,然后用`student.__init__(s1,'李坦克','男',18)`初始化 ### 对象的使用 ``` s1.name #查,等同于s1.__dict__['name'] s1.name='王三炮' #改,等同于s1.__dict__['name']='王三炮' s1.course='python' #增,等同于s1.__dict__['course']='python' del s1.course #删,等同于s1.__dict__.pop('course') ``` ### 类的属性 类有两种属性:数据属性和函数属性 1、类的数据属性是所有对象共享的 ~~~ #类的数据属性是所有对象共享的,id都一样 print(id(student.school)) print(id(s1.school)) #4377347328 print(id(s2.school)) #4377347328 print(id(s3.school)) #4377347328 ~~~ 2、类的函数数据是绑定给对象用的,称为绑定到对象的方法 ~~~ #类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样 print(student.learn) #<function student.learn at 0x1021329d8> print(s1.learn) #<bound method student.learn of <__main__.studentobject at 0x1021466d8>> print(s2.learn) #<bound method student.learn of <__main__.studentobject at 0x102146710>> print(s3.learn) #<bound method student.learn of <__main__.studentobject at 0x102146748>> #ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准 ~~~ ### 属性查找顺序 属性查找顺序:先在对象自己的名称空间找,然后到类中找,再然后到父类中找,直到都找不到而抛出异常 注意下面的案例,属性查找并不是就近原则,而是一定先从对象的名称空间开始 ``` class Foo: def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() class Bar(Foo): def f1(self): print('Bar.f1') b=Bar() b.f2() # 打印结果: Foo.f2 Bar.f1 ``` ### 绑定方法 类中定义的函数,主要是给对象使用的,是绑定到对象的. ~~~ class student: school='CECT' def __init__(self,name,sex,age): self.name=name self.age=age self.sex=sex def learn(self): print('%s is learning' %self.name) #新增self.name def eat(self): print('%s is eating' %self.name) def sleep(self): print('%s is sleeping' %self.name) s1=student('李坦克','男',18) s2=student('王大炮','女',38) s3=student('牛榴弹','男',78) ~~~ 类中定义的函数是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数 ~~~ student.learn(s1) #李坦克 is learning student.learn(s2) #王大炮 is learning student.learn(s3) #牛榴弹 is learning ~~~ 强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法`__init__`也是一样的道理) ~~~ s1.learn() #等同于student.learn(s1) s2.learn() #等同于student.learn(s2) s3.learn() #等同于student.learn(s3) ~~~ **注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。**