Python学习之类、方法、属性和继承的汇总分析(详细)
目录
一、类
创建类:
二、方法:
(1)创建方法:
(2)调用方法:
②通过类直接来调用(需要传递一个实例对象):
③程序在实例化对象的同时,会自动调用。
三、属性:
1、实例属性:
2、类属性(类变量):
四、类的继承:
1、语法规则:
2、继承中方法的重写:
3、调用父类的方法__init__( ):
一、类
创建类:
语法规则:class 类名(object):
pass
class:关键字 类名:大驼峰(每个单词首字母大写) object:默认继承
类不能够直接使用,需要把它转化为一个实例后,才能直接使用,通过类来生成实例对象的过程称为实例化。
创建实例对象的方法:类名()
class Person(object): passclass Animal(object): passandy = Person()jack = Person()dog = Animal()cat = Animal()
二、方法:
方法一般表示这个对象的行为,通常是对象的行为。分为方法__init__( )和普通方法。
(1)创建方法:
语法结构:def 方法名(self,args):
pass
def:关键字 方法名:需要全部小写 self:实例对象 args:参数
方法名全部小写用“_”分割,例如:get_student_name;get_goods_order
(2)调用方法:
①通过实例对象来调用:
class Animal(object): def eat(self,food): print(f"正在吃{food}") def play(self): print("正在玩耍") def sleep(self): print("正在睡觉")dog = Animal()dog.eat("狗粮")dog.play()dog.sleep()
运行结果:
在通过实例对象调用类方法的过程中,传递参数时不用填写self,因为self是一个实例对象,是默认的,第一个参数就是self,程序会默认给self进行一个赋值。因此我们在调用的时候只需要添加第二个参数args。但是实例对象只能调用类中已经定义好的方法,如果没有定义是不能够调用的。
②通过类直接来调用(需要传递一个实例对象):
class Animal(object): def eat(self, food): print(f"正在吃{food}") def play(self): print("正在玩耍") def sleep(self): print("正在睡觉")dog = Animal()Animal.eat(dog,"狗粮")Animal.play(dog)Animal.sleep(dog)
运行结果:
在通过类直接来调用类方法的过程中,传递参数时一定要传递一个实例对象(self),当然有参数args时还是要添加参数。这个方法比较麻烦,因此我们多采用通过实例对象来调用类方法。
实例对象的其它作用:当我们实例化完成后,类中每个方法的self都是相同的,因此可以交叉来使用。我们在学习函数嵌套的时候,我们学了在一个函数内可以调用其它函数,类似的在类方法这里也是一样的,实例对象self可以在每个方法中相互之间进行使用,因为每个方法都有self,而方法之间的相互调用,就和函数之间的嵌套调用是一样的。由于self是类的实例对象,一旦类被实例化后,所有的实例对象都是self。
class Animal(object): def eat(self, food): print(f"正在吃{food}") def play(self): print("正在玩耍") def sleep(self): self.eat("狗粮") # dog.eat("狗粮") print("正在睡觉")dog = Animal()dog.sleep() # Animal.sleep(dog)
运行结果:
③程序在实例化对象的同时,会自动调用。
这是一种特殊的方法:__init__初始化方法。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免python默认方法与普通方法发生名称冲突。务必确保__init__( )的两边都有两个下划线,否则当你使用类来创建实例时,将不会自动调用这个方法,进而引发难以发现的错误。
那么如何初始化呢?就是在定义这个方法的时候,定义一些需要初始化的参数,形参self必不可少,而且必须位于其它形参的前面,其它形参可以没有,也可以是多个。传递参数时不需要传递self,因为每个与实例相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法,但是如果有其它形参,我们就需要传递与之对应的实参。还有需要注意的是,由于__init__( )会优先运行,所以通常我们会将这个方法写在所有方法的最前面。
class Animal(object): def __init__(self,name,age): self.name = name self.age = age print("我是动物") def eat(self, food): print(f"正在吃{food}") def play(self): print(f"{self.name}今年{self.age}岁,正在玩耍") def sleep(self): print("正在睡觉")dog = Animal("泰迪",10)dog.play()pig = Animal("小猪佩奇",8)pig.play()
运行结果:
三、属性:
可以通过实例访问的变量为属性。分为实例属性和类属性。
1、实例属性:
格式:实例.属性
class Animal(object): def __init__(self,name,age): self.name = name self.age = age print("我是动物") def eat(self, food): print(f"正在吃{food}") def play(self): print(f"{self.name}今年{self.age}岁,正在玩耍") def sleep(self): print("正在睡觉")dog = Animal("泰迪",10)dog.play()dog.gender = "男"print(dog.gender)
运行结果:
在该代码中self.name和self.gender中,name和gender就是实例属性。实例属性可以在内部定义,通常在__init__初始化方法中定义,也可以动态地定义,即在外部定义。在调用实例属性的时候,我们可以通过self.这种形式来调用。
class Animal(object): age = 5 def eat(self,food): print(f"正在吃{food}") def play(self): print("正在玩耍") def sleep(self): print("正在睡觉")dog = Animal()pig = Animal()print(dog.age)print(pig.age)print(Animal.age)
2、类属性(类变量):
定义的方法与变量相似。定义的位置在类的内部,在其它函数的外面。类属性对于每一个实例对象都是通用的,即实例对象可以共享类的属性。调用类属性可以通过实例对象来调用,也可以通过类来直接调用。
当我们创建一个类时,创建一个类属性并赋值。把类实例化为两个实例对象。则这两个实例对象都会有一个属性值,值为类属性的值。
class Animal(object): age = 5 def eat(self,food): print(f"正在吃{food}") def play(self): print("正在玩耍") def sleep(self): print("正在睡觉")dog = Animal()pig = Animal()print(dog.age)print(pig.age)print(Animal.age)
运行结果:
但是,当我们把其中一个对象动态地生成一个属性,并赋值,那么这个对象就不会继承类属性的值了,然而另一个没有改动的对象的属性的值依然是类属性的值。
class Animal(object): age = 5 def eat(self,food): print(f"正在吃{food}") def play(self): print("正在玩耍") def sleep(self): print("正在睡觉")Animal.age = 8dog = Animal()dog.age = 10pig = Animal()print(f"dog的age是{dog.age}")print(f"pig的age是{pig.age}")print(f"Animal的age是{Animal.age}")
运行结果:
总结:实例对象的属性值优先考虑自身的,若自身未被赋值,则取类属性的值。
四、类的继承:
1、语法规则:
编写类时,并非总是要从空白开始。如果编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类成为父类,而新的类成为子类。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。创建子类时,父类必须包含在当前文件夹中,且位于子类前面。
类的语法规则为:class 类名(object):
pass
如果要对这个类使用继承,则将object改为一个父类的名称:
class Animal(object): age = 5 def __init__(self,name): self.name = name def eat(self): print(f"{self.name}正在吃东西") def play(self): print(f"{self.name}正在玩耍") def sleep(self): print(f"{self.name}正在睡觉")class Dog(Animal): def bark(self): print(f"{self.name}会汪汪叫")class Pig(Animal): def buu(self): print(f"小猪会咘咘叫")dog = Dog("腊肠狗") #当我们在实例化子类时,会自动调用父类的初始化方法,因此要传递参数namedog.eat()dog.bark()print(dog.age)
运行结果:
2、继承中方法的重写:
当子类中含有与父类相同的方法时,子类会优先调用自身的方法,如果自身的方法不存在,才去调用父类的方法。(子类重写父类的方法)
class Animal(object): age = 5 def __init__(self,name): self.name = name def eat(self): print(f"{self.name}正在吃东西") def play(self): print(f"{self.name}正在玩耍") def sleep(self): print(f"{self.name}正在睡觉")class Dog(Animal): def eat(self): print(f"{self.name}正在吃狗粮") def bark(self): print(f"{self.name}会汪汪叫")class Pig(Animal): def eat(self): print(f"{self.name}正在吃猪粮") def buu(self): print(f"小猪会咘咘叫")dog = Dog("腊肠狗")dog.eat()pig = Pig("家猪")pig.eat()
运行结果:
3、调用父类的方法__init__( ):
当子类和父类同时含有方法__init__( )时,子类的初始化方法会覆盖掉父类的初始化方法。但是我们在既有类的基础上编写新类时,通常要调用父类的方法__init__( ),这时我们如果想要保留父类的初始化方法时,需要使用super()函数,super含有上级的意思,这个函数就表示调用子类的上级,即父类。格式为super( ).__init__(args).如果父类的初始化方法中含有参数,则子类的初始化方法中也应含有相应的参数,然后通过args接收。
class Animal(object): def __init__(self,name): self.name = name def eat(self): print(f"{self.name}正在吃东西") def play(self): print(f"{self.name}正在玩耍") def sleep(self): print(f"{self.name}正在睡觉")class Dog(Animal): def __init__(self,name,age): super().__init__(name) self.age = age def eat(self): print(f"{self.name}今年{self.age}岁了,正在吃狗粮") def bark(self): print(f"{self.name}会汪汪叫")dog = Dog("腊肠狗",10)dog.eat()
运行结果:
创作不易!如果觉得还可以的话可以点个赞哦,谢谢!