|
Class类用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。一个人(身高:一米八)要吃饭、喝水、睡觉;一只老虎(体重:300斤)要奔跑、洗澡、捕猎。一、名词定义类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。一般位置:类变量定义在类中且在函数体之外。固有属性由类变量表示。类变量通常不作为实例变量使用。对类变量的修改会影响到类的所有实例。数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。实例变量:一般位置:在类的__init__声明中。属性是用变量来表示的,这种变量就称为实例变量,且一般是自定义属性。局部变量:一般位置:定义在方法中的变量。只作用于当前实例(对象)的类。一旦函数或方法执行完毕,局部变量就会被销毁。局部变量与类本身无关,无论是在类的内部还是外部定义的方法中,都可以有局部变量。继承:即一个派生类(derivedclass)继承基类(baseclass)的属性和方法。继承也允许把一个派生类的对象作为一个基类对象对待。实例化:创建一个类的实例,即创建一个类的具体对象。实例是可以更改、删除原属性的。对象:通过类定义的数据结构实例,实例即对象。对象包括两个数据成员(类变量和实例变量)和方法。二、先睹为快通俗举例:#通俗举例:定义一个人(男性)要吃饭、喝水、睡觉;现在有个具体的人,他被赋予上述定义,所以他便是男人,会吃饭,会喝水,会睡觉。#类名:一个人#属性:男性#方法:吃饭、喝水、睡觉#对象:这个具体的人(赋予这个人相同的属性、方法的过程叫“实例化”)1234567无__init__代码举例(有__init__的后面会写):classCalculator:#Calculator:类名name='Goodcalculator'#name:类变量(固有属性)price=18#price:类变量(固有属性)defadd(self,x,y):#add():方法result=x+y#result:局部变量print(result)defminus(self,x,y):#minus():方法result=x-y#result:局部变量print(result)deftimes(self,x,y):#times():方法print(x*y)defdivide(self,x,y):#divide():方法print(x/y)cal1=Calculator()#☆实例化(cal1也有了相同的属性和方法)————————————————————————————————————————————————————————————————————————————————————————————>>>cal1.name----->'Goodcalculator'>>>cal1.add(1,2)----->3>>>cal1.price----->18>>>cal1.price=25>>>cal1.price----->25#实例的属性可以修改1234567891011121314151617181920三、详细解释(1)self在用def定义方法时,第一个参数一定得是self。self代表的是类的实例(对象),本质是代表当前对象的地址,不是类;而self.class则指向类。请看VCR:classTest:defprt(self):print(self)print(self.__class__)t=Test()t.prt()————————————————————————————————————————————————————————————————————————————————————————————#输出结果为(两个print的结果):__main__.Test1234567891011self不是python关键字,可以把它换成别的单词,但仍强烈建议使用self。(2)方法在类的内部,使用def关键字来定义一个方法。与一般函数不同,类的方法在定义时必须包含参数self,且为第一个参数,self代表的是类的实例。self不是python的关键字,所以可以用别的单词来代替self。但按照惯例,最好就用self。defadd(self,x,y)#add即为方法名,x和y为调用该函数需要输入的参数result=x+y12__init__一种特殊的方法,可称之为“构造方法”,初始化(Initialize的缩写)前后各两个下划线在实例化时,会自动调用,用来初始化自定义属性有__init__代码举例(没给出默认自定义属性,实例化时需要手动给出):下方代码要注意一点,自定义属性是hight这些,不是hig这些,hig只是输入参数。classCalculator:#Calculator:类名class_variable="Iamaclassvariable"#这是一个类变量(固有属性)name='Goodcalculator'#name:类变量(固有属性)price=18#price:类变量(固有属性)#*****************************def__init__(self,hig,wid,wei):#*self.hight=hig#hight:实例变量(自定义属性)*self.width=wid#width:实例变量(自定义属性)*self.weight=wei#weight:实例变量(自定义属性)*#*****************************defadd(self,x,y):#add():方法result=x+y#result:局部变量print(result)defminus(self,x,y):#minus():方法result=x-y#result:局部变量print(result)deftimes(self,x,y):#times():方法print(x*y)defdivide(self,x,y):#divide():方法print(x/y)————————————————————————————————————————————————————————————————————————————————————————————#先运行程序>>>cal2=Calculator(1,5,12)#实例化时,一定要给出自定义属性的内容>>>cal2.name----->'Goodcalculator'>>>cal2.hight----->1>>>cal2.add(1,2)----->3>>>cal2.price----->18>>>cal2.price=25>>>cal2.price----->25#实例的固有、自定义属性都可修改1234567891011121314151617181920212223242526272829有__init__代码举例(给出默认自定义属性):...#同上#*******************def__init__(self,hight=1,width=5,weight=12):*self.hight=hight#hight:自定义属性*self.width=width#width:自定义属性*self.weight=weight#weight:自定义属性*#*******************...#同上————————————————————————————————————————————————————————————————————————————————————————————#先运行程序>>>cal2=Calculator()#实例化时,不用再给出自定义属性,除非要修改1234567891011(3)继承就是先定义了一个基准类,后面想再定义一个派生类,该派生类想沿用基准类的属性和方法,这种沿用过程就叫“继承”。子类(派生类DerivedClassName)会继承父类(基类BaseClassName)的属性和方法。单继承:当基类和派生类处于同一个模块中时:class派生类名(基类名):...代码块...1234当基类和派生类不在同一个模块中时,需要从基类所在模块导入基类:写法一(仅导入基类):#假设基类BaseClassName在模块modname中frommodnameimportBaseClassNameclassDerivedClassName(BaseClassName):...代码块...1234567写法二(直接导入基类所在模块):#假设基类BaseClassName在模块modname中importmodnameclassDerivedClassName(modname.BaseClassName):...代码块...1234567示例:#类定义classpeople:#定义基本属性name=''age=0#定义私有属性,私有属性在类外部无法直接进行访问__weight=0#定义构造方法def__init__(self,n,a,w):self.name=nself.age=aself.__weight=wdefspeak(self):print("%s说:我%d岁。"%(self.name,self.age))#单继承示例classstudent(people):grade=''def__init__(self,n,a,w,g):#调用父类的构函people.__init__(self,n,a,w)self.grade=g#覆写父类的方法defspeak(self):print("%s说:我%d岁了,我在读%d年级"%(self.name,self.age,self.grade))s=student('ken',10,60,3)s.speak()————————————————————————————————————————————————————————————————————————————————————————————#输出结果为:ken说:我10岁了,我在读3年级12345678910111213141516171819202122232425262728293031多继承:#参考菜鸟教程,基本不用:https://www.runoob.com/python3/python3-class.html12(4)方法重写如果父类定义的方法的功能不能满足需求,则可以在子类重写父类的方法。示例:classParent:#定义父类defmyMethod(self):print('调用父类方法')classChild(Parent):#定义子类defmyMethod(self):print('调用子类方法')c=Child()#子类实例c.myMethod()#子类调用重写方法super(Child,c).myMethod()#用子类对象调用父类已被覆盖的方法————————————————————————————————————————————————————————————————————————————————————————————#输出结果为:调用子类方法调用父类方法123456789101112131415四、实例变量、局部变量、类变量的GPT解释在Python的继承机制中,理解实例变量、局部变量、和类变量是非常重要的。这些变量在类及其对象中的作用域和生命周期各不相同。下面是对这些变量的详细解释:实例变量(InstanceVariables)实例变量也称为对象变量,它们是在类的实例(即对象)中定义的变量。每个实例都有自己独立的实例变量副本,即使两个实例属于同一个类,它们的实例变量值也可以是不同的。实例变量通常通过类的构造方法(__init__)来初始化。classMyClass:def__init__(self,value):self.instance_variable=value#这是一个实例变量obj1=MyClass(10)obj2=MyClass(20)print(obj1.instance_variable)#输出:10print(obj2.instance_variable)#输出:20123456789局部变量(LocalVariables)局部变量是在函数或方法内部定义的变量。它们的作用域仅限于定义它们的函数或方法。一旦函数或方法执行完毕,局部变量就会被销毁。局部变量与类本身无关,无论是在类的内部还是外部定义的方法中,都可以有局部变量。classMyClass:defmy_method(self):local_variable="Iamalocalvariable"#这是一个局部变量print(local_variable)obj=MyClass()obj.my_method()#输出:Iamalocalvariable#在这里,local_variable已经不存在了12345678类变量(ClassVariables)类变量是在类级别定义的变量,它们不属于类的任何特定实例。相反,它们被类的所有实例共享。类变量可以通过类本身来访问,也可以通过类的任何实例来访问。当通过实例修改类变量时,这个改变会影响到所有实例,因为所有的实例共享同一个类变量。classMyClass:class_variable="Iamaclassvariable"#这是一个类变量def__init__(self,value):self.instance_variable=valuedefprint_variables(self):print(self.class_variable)#通过实例访问类变量print(MyClass.class_variable)#直接通过类名访问类变量#修改类变量MyClass.class_variable="Ihavebeenmodified"obj1=MyClass(10)obj2=MyClass(20)obj1.print_variables()#输出:Ihavebeenmodified和Ihavebeenmodifiedobj2.print_variables()#输出同上,因为类变量被所有实例共享123456789101112131415161718注意:尽管可以通过实例访问类变量,但最好通过类名来访问和修改类变量,以避免潜在的混淆。特别是在通过实例修改类变量时,要清楚这样做会影响所有实例共享的类变量值。
|
|