您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

面向对象进阶版!从入门到大牛!Python就是这么牛逼!

5b51 2022/1/14 8:24:55 python 字数 24139 阅读 797 来源 www.jb51.cc/python

定义类 在Python中,类的定义使用class关键字来实现,语法如下: classClassName: \'\'\'类的帮助信息\'\'\'#类文档字符串

概述

在 Python 中,类的定义使用 class 关键字来实现,语法如下:

class ClassName:
 '''类的帮助信息''' # 类文档字符串
 statement # 类体

参数说明:

class Animal:
 '''动物类'''
 pass

class 语句本身并不创建该类的任何实例。所以在类定义完成以后,可以创建类的实例,即实例化该类的对象。创建类的实例的语法如下:

进群:548377875   即可获取数十套PDF哦!

ClassName(parameterlist)

例如,创建Geese 类的实例,可以使用下面的代码

wildGoose = Animal() # 创建动物类的实例
print(wildGoose) # 输出实例

执行上面代码后,将显示类似下面的内容

<__main__.Animal object at0x0000000002F47AC8>

从上面的执行结果中可以看出, wildGoose 是 Geese 类的实例。

 类中的方法函数非常相似,可以理解为方法是在类中定义的函数。创建方法和创建函数类似,语法格式如下:
def functionName(self,parameterlist):
 block

参数说明如下:

实例方法创建完成后,可以通过类的实例名称和点(.)操作符进行访问。具体的语法格式如下:

instanceName.functionName(parametervalue)

创建一个Animal类,并定义eat()、play()和sleep()3个方法。实例化Animal类,并调用这3个方法。下面看一段示例代码

class Animal: # 创建动物类
 '''动物类'''
 def eat(self): # 定义吃食物方法
 print('正在吃食物')
 def play(self): # 定义玩耍方法
 print('正在玩耍')
 def sleep(self): # 定义休息方法
 print('正在休息')
Dog = Animal() # 创建动物类的实例
Dog.eat() # 调用吃食物的方法
Dog.play() # 调用玩耍的方法
Dog.sleep() # 调用休息的方法

运行结果如下所示。

正在吃食物
正在玩耍
正在休息

在创建类后,通常会创建一个__init__()方法。该方法一个特殊的方法,类似Java语言中的构造方法。每当创建一个类的新实例时,Python都会自动执行它。__init__()方法必须包含一个self参数,并且必须是第一个参数。self参数是一个指向实例本身的引用,用于访问类中的属性方法。在方法调用时会自动传递实际参数self。因此,当__init__()方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。

class Animal: # 创建动物类
 '''大雁类'''
 def __init__(self):
 print('这是一个动物类')
 def eat(self): # 定义吃食物方法
 print('正在吃食物')
 def play(self): # 定义玩耍方法
 print('正在玩耍')
 def sleep(self): # 定义休息方法
 print('正在大雁休息')
Dog = Animal() # 创建动物类的实例
Dog.eat() # 调用吃食物的方法
Dog.play() # 调用玩耍的方法
Dog.sleep() # 调用休息的方法

运行结果如下所示。

这是一个动物类
正在吃食物
正在玩耍
正在大雁休息

从上面的运行结果可以看出,在创建大雁类的实例时,虽然没有为__init__()方法指定参数,但是该方法自动执行。

__init__()方法中,除了self参数外,还可以自定义一些参数,参数间使用逗号“,”进行分隔。例如,下面的代码将在创建__init__()方法时,再指定3个参数,分别是name、gender和weight。

class Animal: # 创建动物类
 '''动物类'''
 def __init__(self,name,gender,weight):
 '''初始化赋值'''
 self.name = name
 self.gender = gender
 self.weight = weight
 def info(self):
 '''输出基本信息'''
 if self.gender == 'male':
 print('这只%s是公的' % self.name)
 else :
 print('这只%s是母的' % self.name)
 print('%s的重量是%s千克' % (self.name,self.weight))
dog = Animal('腊肠狗','male',10) # 创建动物类的实例
dog.info() # 调用实例的info方法输出基本信息
cat = Animal('波斯猫','female',5) # 创建动物类的实例
cat.info() # 调用实例的info方法输出基本信息

执行上面的代码,运行结果如下:

这只腊肠狗是公的
腊肠狗的重量是10千克
这只波斯猫是母的
波斯猫的重量是5千克
 上述代码中,__init__()方法的参数包含新创建的实例self和在调用类对象时提供的参数。在__init__()内,通过将属性分配给self来将其保存到实例中。例如,self.name = name表示将name属性保存在实例中。在新创建的实例返回到goods_a和goods_b后,使用点号(.)运算符即可访问这些属性以及类的属性。如goods_a.info()。点号(.)运算符属于属性绑定。访问属性时,首先会检查实例,如果不知道该属性的任何信息,则会对实例的类进行搜索。这是因为类和其所有实例共享其属性的底层机制。

常见错误:在为类创建__init__()方法时,在开发环境中运行下面代码

class Animal:
 '''动物类'''
 def __init__(): # 构造方法
 print("这是动物类!")
dog = Animal()# 创建动物类的实例

显示如下所示的异常信息。该错误解决方法是在第3行代码的括号中添加self。

Traceback (most recent call last):
 File "test.py",line 6,in 
 
  
 dog = Animal()# 创建动物类的实例
TypeError: 
  __init__() takes 0 positional arguments but 1 was given

 

在编写类方法时,必须多加一个self在参数列表开头,但是我们却没有为这个参数赋值,那么这个self的作用是什么呢?其实,self是一种特定的变量,它引用的是对象本身。按照惯例,它被赋予self这一名称。当然也可以使用其他的名字,但是强烈推荐使用self这一名称,因为任何一个程序员都可以一眼认出它。

那么 Python 是如何给 self 赋值的?我们依然以动物类为例。在Animal类创建了2个实例dog和cat 。当调用这个对象的方法,如 dog.info()时,Python将会自动将其转换成Animal.info(dog) 。同理,当调用cat.info()时,Python将会自动将其转换成Animal.info(cat) 。如果info()函数还有参数,例如:

def info(self,arg1,arg2):
 pass

那么调用dog.info(arg1,arg2)时,Python将会自动将其转换成Animal.info(dog,arg2) 。

前面介绍了类中的方法,本节来介绍一下类中的另一个成员——属性。所谓的属性,可以理解为在类中定义的变量。根据定义位置,又可以分为类属性和实例属性

1.类属性

属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中公用。

例如,定义一个Animal类,然后定义1个类属性代码如下:

class Animal:
 age = 5

可以通过2种方式来调用属性:类名.属性名和实例名.属性名。例如:

class Animal:
 age = 5
print(Animal.age)# 类名调用属性输出结果为 5
dog =Animal()# 实例化Animal类
print(dog.age)# 实例名调用属性,输出结果为 5
cat =Animal()# 实例化Animal类
print(cat.age)# 实例名调用属性,输出结果为 5

上述代码中,Animal类有一个属性age,所以Animal.age的值为5。但是Animal的2个实例dog和cat为什么也能够获取age属性呢?这就是属性继承搜索功能。下面的类树图可以很好的解释这个问题。

面向对象进阶版!从入门到大牛!Python就是这么牛逼!

上图中,Animal类有一个属性age,并且通过Animal类创建了2个实例dog和cat。当调用dog.age时,由于age实例的age属性不存在,所以会继续向上搜索到Animal,发现Animal类中有age属性,所以,dog.age为5。

创建一个Animal类,该类有一个属性age,并创建2个实例dog和cat,如果更改Animal类age属性的初始值,那么,dog.age和cat.age是否会发生变化呢?下面通过一个例子来学习一下。

class Animal:
 age = 5
dog = Animal() # 实例化Animal类
cat = Animal() # 实例化Animal类
dog.age = 10
Animal.age = 8
print('Animal类的age属性值为%s' % Animal.age) # 类名调用属性输出结果为 8
print('dog实例的age属性值为%s' % dog.age) # 实例名调用属性,输出结果为 10
print('cat实例的age属性值为%s' % cat.age) # 实例名调用属性,输出结果为 8

运行结果如下。

Animal类的age属性值为8
dog实例的age属性值为10
cat实例的age属性值为8

上述代码中,对于dog实例,动态为其添加属性age,dog.age在查找时,优先查找dog实例的age,所以结果为10。接下来,动态更改Animal类的age属性值,所以Animal.age的值变为8。而由于cat实例没有age属性,所以向上查找Animal类的属性,此时,由于Animal的age属性值已经变为8,所以cat.age为8。通过下图可以更好理解赋值过程。

面向对象进阶版!从入门到大牛!Python就是这么牛逼!

2.实例属性

实例属性是指定义在类的方法中的属性,只作用于当前实例中。在18.2.4节创建__init__()方法时,就使用了实例属性

创建一个Animal类,该类中有3个方法__init__()初始化方法,info()输出详细信息方法以及get_gender()判断动物性别的方法

__init__()初始化方法中,使用self.name、self.gender和self.weight设置实例属性

class Animal: # 创建动物类
 '''动物类'''
 def __init__(self,weight):
 '''初始化赋值'''
 self.name = name
 self.gender = gender
 self.weight = weight
 def info(self):
 '''输出基本信息'''
 gender = self.get_gender(self.gender)
 print('这只%s%s的' % (self.name,gender))
 print('%s的重量是%s千克' % (self.name,self.weight))
 def get_gender(self,gender):
 '''判断动物的性别'''
 if self.gender == 'male':
 gender = '公'
 else :
 gender = '母'
 return gender
dog = Animal('腊肠狗',5) # 创建动物类的实例
cat.info() # 调用实例的info方法输出基本信息

运行结果如下所示。

这只腊肠狗是公的
腊肠狗的重量是10千克
这只波斯猫是母的
波斯猫的重量是5千克

总结

以上是编程之家为你收集整理的面向对象进阶版!从入门到大牛!Python就是这么牛逼!全部内容,希望文章能够帮你解决面向对象进阶版!从入门到大牛!Python就是这么牛逼!所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶