Python中类、对象与self详解
先介绍一下python中的类与对象/实例。然后详细说明self。说明:对象等同实例,本文称呼不一致时请自行统一
【一】类与对象/实例
1、类
(1)类由名称、属性、方法三部分组成
(2)类是抽象模板,比如学生,汽车可以用Student、Car类来表示
(3)类命名规范:数字、字母、下划线,数字不能开头;要驼峰式命名
(4)定义类:
第一种:class 类名:(冒号缩进,代码块内含属性与方法)
第二种:class 类名(object):(--(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。--)
#子类继承父类 class Parent: def pprt(self): print(self) class Child(Parent): #表示子类从父类继承 def cprt(self): print(self) c = Child() c.cprt() # Child类的实例 c.pprt() #self指的是Child类的实例,父类Parent中定义了pprt()方法 p = Parent() p.pprt() # Parent类的实例
(5)关于self:类函数需要定义一个‘self’,不用理会不需要赋值;self不是py关键字,但是必填;self可以用其他参数替代,如“this、a”,只是约定俗称
(6)如下图:p.sayhello() ,实际上Python解释成Person.sayhello(p),也就是说把self替换成类的实例
# 实例说明self代表是是对象/实例本身,而非类本身(类中包含多个对象)
# self不必非写成self,可以其它参数代替,只是约定俗成,但必须写
class Person: def sayhello(self): print(self) print('***********分割线*************') print('My name is:linda') p=Person() p.sayhello() #等同:Person.sayhello(p)
# 如果我们的定义和调用时均不传类实例是可以的,这就是类方法 class Person: def sayhello(): print() print('***********分割线*************') print('My name is:linda') p=Person() Person.sayhello() # 定义和调用均不传类实例
2、对象/实例
(1)对象是由类 创建出来的实体,对象也称实例
(2)对象要从类中继承方法,具有类里面所有属性和方法的使用权限
(3)创建方式:对象名 = 类() ---如: tom
= Person()
class Person: def sayhello(self): print(self) print('***********分割线*************') print('My name is:linda') p=Person()
3、__init__
方法: ---也叫 初始化方法
类中定义了__init__方法,则表示在创建对象时系统会默认调用此方法,也叫初始化方法
由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__
方法,例如在Person类时,把name、age等属性绑上去:
说明:
1、类在创建对象时就已经有默认的属性(如创建一辆汽车时就已经注定这个车子是什么品牌,有几个轮子等),所以类的属性一般定义在__init__方法中
2、__init__方法在创建对象时候被调用,所以属性通过(对象 = Car(属性))传入方法中
【注意点】(1)__init__
方法的第一参数永远是self
,表示self指向创建的类实例本身,因而,在__init__
方法内部,可以把各种属性绑定到self,等同于绑定创建的实例本身
(2)__init__
方法 在创建实例时,不可传入空的参数,必须传入与__init__
方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去
(3)如上图: self.name = name的意思就是把外部传来的参数name的值赋值给Person类自己的属性变量self.name
说明:self就是指类本身,self.name就是Person类的属性变量,是Person类所有。而name是外部传来的参数,不是Person类所自带的。
【二】self的详细说明
1、说明:
(1)# 实例说明self代表是是对象/实例本身,而非类本身(类中可包含多个对象)
(2)# self不必非写成self,可以其它参数代替,只是约定俗成,但必须写
(3)# 如果我们的定义和调用时均不传类实例也是可以的
2、关于类函数/类方法
【?】类函数与普通函数的区别:
仅在于类函数:第一参数永远是类的本身实例变量self
,调用时,不用传递该参数
(1)方法,通俗点来说就是函数; ---把每一项类中所有的功能封装起来称为方法,一般方法里的内容就是方法的执行过程
方法多具有执行性
举例: 比如类表示的是People 也就是人
人的类中会有一些属性 这些属性大概是 身高、体重、姓名等等
那么方法比如是 跑、吃、等等
class Person(object): def __init__(self, name, age): self.name = name self.age = age print('我叫{0},我今年{1}岁'.format(self.name,self.age)) #我叫小明,我今年18岁 person=Person("小明",18) person.name person.age
【说明】Person类实例本身拥有一些数据,那么要访问这些数据,就不需要从外面的函数去访问,可直接在Person类的内部定义访问数据的函数(方法),这样,就可以把”数据”封装起来。
这些封装数据的函数是和Person类本身是关联起来的,称之为类的方法
我们从外部看Person类,只需要知道,创建实例需要给出name和age。
而如何打印,都是在Person类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部实现的细节。
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮
(注意)Python中,变量名类似__xxx__
的,也就是以双下划线开头,且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不可以这样命名