> 文档中心 > Python学习之类、方法、属性和继承的汇总分析(详细)

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()

运行结果:

 

 创作不易!如果觉得还可以的话可以点个赞哦,谢谢!