Python知识4 类与对象【多测师】
一、类与对象、实例化的概念 1.Python中实例变量:定义在方法中的变量,只作用于当前实例的类。这个和Java不同 Java中实例变量的作用于全局变量,但是只能被对象调用。 2.实例化:创建一个类的实例,类的具体对象 3.类实例化后,可使用其属性,可以通过类名访问属性 4.类对象支持俩种操作:属性引用和实例化 二、类创建和调用 1.调用类的属性和对象的方法 class MyClass: i=123 def n(self): return 'haha' x=MyClass() print(x.i) //调用类的属性 print(x.n()) //实例化对象之后调用方法 三、Python的构造方法 def __init__(self): //初始化的实例对象 self.data=[] Python中self的含义: 1.这里指自己,实例instance本身 2.此处的self是个对象 object 是当前类的实例 3.函数也叫方法 4.其实这里的self和Java中的this差不多 5.类方法必须包含参数self,且为第一个参数,self代表的是类的实例 6.学习网址:https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/ 四、函数的第一个参数self和Class函数中访问对应的变量(读取和写入)和调用对应函数 1.访问对应的变量self.valueName 2.调用对应的函数self.function() 调用函数函数名后面都有小括号() 3.Python中约定俗成,函数的第一个参数必须为实例对象本身名字写成self 4.代码演示如果没有在类Class的最初的_init_函数中,正确的初始化实例变量,会导致后续没有变量可用,会出现AttributeError错误 从上述代码可见,由于在类的初始化(实例化)的__init__函数中,没有给self.name设置值,使得实例中,根本没有name这个变量,导致后续再去访问self.name,就会出现AttributeError的错误了。 对应的,如果写成self.name,则意思就正确了,就是初始化的时候,给实例中新增加,并且正常设置了正确的值newPersionName了,所以后续再去通过self.name,就可以访问到,当前实例中正确的变量name了。 正确的代码如下: 在函数中,使用对应的变量,虽然代码是可以运行的,但是实际上却是使用的,不是实例中的变量 有时候,虽然你写的代码,可以运行,但是使用到的变量,由于没有加self,实际上是用到的不是实例的变量,而是其他的变量。 此类问题,主要和Python中的变量的作用域有关,但是此处例子中,也和是否使用self有关: 际上其中,可见,此处开始__init__中,没有给self实例初始化对应的name,而后面的函数sayYourName中,虽然可以调用到self.name而没有出现AttributeError错误,但是实际上此处的值,不是所期望的,传入的name,即"crifan",而是类中的name的值,即"class global name”。 五、Python中为什么要有_init_ 1.支持带参数的类的初始化 对应Class初始化时 可以运行传递不同的参数 其中,就是针对Person这个类 不同的示例,在初始化的时候,都传递一个对应的参数,这样不同的Person,就都有了自己的不同的名字了。 这个,至少看起来,有点类似于,其他语言中的,传递特定参数去对类进行初始化。 实现类本身相关内容的初始化 当一个Class,稍微复杂一点的时候,或者内部函数需要用得到的时候,往往都需要在,别人实例化你这个类之前,使用你这个类之前,做一些基本的,与自己的类有关的,初始化方面的工作,而这部分工作,往往就放到__init__函数中去了。 换句话说,你要用人家的类(中的变量和函数)之前,总要给人家一个机会,做点准备工作,然后才能为你服务吧。 演示代码就不用了,因为上面的代码,也可以算是这方面的例子了,不同的人,应该有不同的名字,而给不同的人设置不同的名字,也是需要在调用sayYourName之前,就先初始化好的。 六、类的方法 在类的内部用def关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数self且为第一个参数,self代表的是类的实例 代码如下: # 类定义 class people: # 定义基本属性 name = '' age = 0 # 定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 # 定义构造方法 def __init__(self, n, a, w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" % (self.name, self.age)) # 实例化类 p = people('xiaoshu', 10, 30) p.speak()
一、self是什么东西? OOP 面向对象编程 OOD 面向对象设计 OOA 面向对象分析 Python的self 就等于C++的this的指针 类是图纸 由类实例化后的对象才是真正可以住人的房子 可以根据图纸可以生产成千上万的房子 self就是门牌号 类生产很多对象 class Ball: def setName(self,name): self.name = name def kick(self): print("我叫%s,该死的,谁踢我..."%self.name) a=Ball() a.setName('球A') b=Ball() b.setName('土豆') a.kick() b.kick() 运行结果: 我叫球A,该死的,谁踢我... 我叫土豆,该死的,谁踢我… 二、构造方法 1._init_(self) 只要实例化一个对象 那么这个方法就会在对象创建的时候自动被调用 2.实例化对象可以传入参数 重写这个init方法来进行初始化操作 3.实例代码如下: class Ball: def __init__(self,name): self.name = name def kick(self): print("我叫%s,该死的,谁踢我..." % self.name) a=Ball('球A') a.kick() b=Ball() //这个就会报错需要传入name参数 三、公有被私有 1.苍井空是世界的 老婆是自己的 2.Python的属性和方法都是公有的 class Person: name ='我是帅的' p = Person() p.name 3.在Python中定义私有变量只需要在变量名或函数名前加上 __双下划线name这个函数或变量就会变为私有的了。 4.私有变量 class Person: __name ='我是帅的' def getName(self): return self.__name p = Person() p.__name //这个是访问不到的 p.getName() //只能通过这个内部的方法调用 p._Person__name //这个可以调用、因为Python的私用机制是的概念其实是伪私有的 Python的类是没有权限控制的 变量是可以被外部调用的