首页 / PYTHON / Python 【类与对象】
Python 【类与对象】
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python 【类与对象】,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8324字,纯文字阅读大概需要12分钟。
内容图文
类与对象
把类的个例就叫做实例 (instance),可理解为“实际的例子”
类是某个特定的群体,实例是群体中某个具体的个体
Python中的对象等于类和实例的集合:即类可以看作是对象,实例也可以看作是对象,
比如列表list是个类对象,[1,2]是个实例对象,它们都是对象
“万事万物,皆为对象”
类的创建和调用
类的创建
类名的首字母要大写
1 class Chinese: # 创建一个类2 eye = ‘black‘34def eat(self): #参数self的特殊之处:在定义时不能丢,在调用时要忽略5print(‘吃饭,选择用筷子。‘) 67 wu = Chinese() # 类的实例化8print(wu.eye) # 实例调用类属性9 wu.eat() # 调用类中的方法(传参不用管self)
print(type(wu))
<class ‘__main__.Chinese‘> #验证了wufeng属于Chinese这个类
print(wu)
<__main__.Chinese object at 0x7f295682d400> #Chinese类的一个实例对象(object),后面的一串字符表示这个对象的内存地址
#类中创建的属性和方法可以被其所有的实例调用,
而且,实例的数目在理论上是无限的。
我们可以同时“新建”多个实例
类也被称为“实例工厂”,因其为所有实例提供了一套蓝图(即预先设定好有什么属性和方法)
创建类的两个关键点
一 。特殊参数:self
那么如果想在类的内部调用类属性,而实例又还没创建之前,我们就需要有个变量先代替实例接收数据,这个变量就是参数self。
1 class Chinese: 2 3 name = ‘吴‘# 类属性name45def say(self): 6print(self.name + ‘是中国人‘) 78 person = Chinese() # 创建Chinese的实例person9 person.say() # 调用实例方法
当最后一行代码运行时,实例person会像参数一样传给self,替换掉self,self.name等价于person.name
person.name就相当于调用了类属性name(即‘吴‘),然后跑完整个方法
相当于以下:
1 class Chinese: 2 3 name = ‘吴‘# 类属性name 4 5def say(person): 6print(person.name + ‘是中国人‘) 7 8 person = Chinese() # 创建Chinese的实例person 9 person.say() # 调用实例方法10 吴是中国人
如果想在类的方法内部调用其他方法时,我们也需要用到self来代表实例
1 class Chinese: 2 3 def greeting(self): 4 print(‘很高兴遇见你‘) 5 6def say(self): 7 self.greeting() 8print(‘我来自中国‘) 910 person = Chinese() # 创建实例person1112 person.say() # 调用say()方法13很高兴遇见你 14 我来自中国
self代表的是类的实例本身,方便数据的流转
对此,我们需要记住两点
第一点:只要在类中用def创建方法时,就必须把第一个参数位置留给 self,并在调用方法时忽略它(不用给self传参)。
第二点:当在类的方法内部想调用类属性或其他方法时,就要采用self.属性名或self.方法名的格式。
##############################################################################################
二。特殊方法:初始化方法 (也叫构造函数)
定义初始化方法的格式是def __init__(self),是由init加左右两边的【双】下划线组成
初始化方法的作用在于:当每个实例对象创建时,该方法内的代码无须调用就会自动运行。
1 class Chinese: 2 3 def __init__ (self): 4 print(‘很高兴遇见你,我是初始化方法‘) 56 person = Chinese() 7 很高兴遇见你,我是初始化方法
编写习惯上,我们会在初始化方法内部完成类属性的创建,为类属性设置初始值,
这样类中的其他方法就能直接、随时调用
1 class Chinese: 2 def __init__ (self): 3 self.mouth = 1 # self.不能丢 4 self.eye = 2 5 6def body(self): 7print(‘我有%s张嘴巴‘ % self.mouth) 8print(‘我有%s只眼睛‘ % self.eye) 910 person = Chinese() 11person.body() 12我有1张嘴巴 13 我有2只眼睛
除了设置固定常量,初始化方法同样可以接收其他参数
1 class Chinese: 2 3 def __init__ (self, name, birth, region): 4 self.name = name # self.name = ‘吴‘ 5 self.birth = birth # self.birth = ‘广东‘ 6 self.region = region # self.region = ‘深圳‘ 7 8def born(self): 9print(self.name + ‘出生在‘ + self.birth) 1011def live(self): 12print(self.name + ‘居住在‘ + self.region) 1314 person = Chinese(‘吴‘,‘广东‘,‘深圳‘) # 传入初始化方法的参数15#初始化方法有多个参数的时候,在实例化的时候就要传入相应的值16person.born() 17person.live() 18吴出生在广东 19 吴居住在深圳
#其实还可以不用初始化方法也能实现
但是此方法比不上初始化方法
初始化优点:
至少不必重复传参,传入的数据还可以被多次调用
1 class Chinese: 2 3 def born(self, name, birthplace): 4 print(name + ‘出生在‘ + birthplace) 5 6def live(self, name, region): 7print(name + ‘居住在‘ + region) #不建议用此方法 8 9 person = Chinese() 10 person.born(‘吴‘,‘广东‘) 11 person.live(‘吴‘,‘深圳‘)
一次性调用
1 class Chinese: 2 def __init__ (self,hometown,region): 3 self.hometown = hometown 4 self.region = region 5print(‘程序持续更新中……‘) 6 7def born(self): 8print(‘我生在%s。‘%(self.hometown)) 910def live(self): 11print(‘我在%s。‘%(self.region)) 1213# 新建方法,调用上面的两个方法(注:方法名可自定义)。14def citys(self): 15 self.born() 16 self.live() 1718 wu = Chinese(‘广东‘, ‘深圳‘) 19wu.citys() 20# 调用方法后,程序运行方法中的代码(即依次调用方法`born`和`live`)。21程序持续更新中…… 22我生在广东。 23 我在深圳。
#####################################################################################################
面向对象编程
与面向对象编程相对应的是面向过程编程
面向过程编程:首先分析出解决问题所需要的步骤(即“第一步做什么,第二步做什么,第三步做什么”),
然后用函数实现各个步骤,再依次调用。
面向对象编程,将代码具体的数据和处理方法都封装在类中,让我们不用完全了解过程也可以调用类中的各种方法。
这个优势让我们可以在 Python 中轻松地调用各种标准库、第三方库和自定义模块(可以简单理解成别人写好的类)
#类编写一个直观的好处就是参数的传递会比普通函数要省事很多,也不必考虑全局变量和局部变量,因为类中的方法可以直接调用属性。
#####################################################################################################################
综合例子
1 class Robot: 2 def __init__ (self): 3 self.name = input(‘我现在刚诞生,还没有名字,帮我起一个吧。‘) 4 self.master = input(‘对了,我要怎么称呼你呢?‘) 5print(‘你好%s,我叫%s。很开心,遇见你~‘%(self.master,self.name)) 6 7def say_wish(self): 8 wish = input(‘告诉我一个你的愿望吧:‘) 9print(self.master+‘的愿望是:‘) 10# 这里也可以用字符串的格式化,不过,用循环语句的话,之后改复述次数会方便些。11for i in range(3): 12print(wish) 1314 robot1 = Robot() 15 robot1.say_wish()
#############################################################################################################################
类的继承和定制
A类属于B类,自然也拥有了B类的所有属性和方法。
这句话在编程里就是:A类继承了B类。
Python中,我们的习惯表述是:A类是B类的子类,而B类是A类的父类(或超类)
定制
子类也可以在继承的基础上进行个性化的定制
(1)创建新属性、新方法;
(2)修改继承到的属性或方法。
————————————————————————————————————————————
继承的基础语法
class Chinese:在运行时相当于class Chinese(object):。
而object,是所有类的父类,我们将其称为根类(可理解为类的始祖)。
1 # 函数isinstance(),判断某个实例是否属于某个类 2 print(isinstance(1,int)) ## 判断1是否为整数类的实例3True 4print(isinstance(1,str)) 5False 6print(isinstance(1,(int,str))) # 判断实例是否属于元组里几个类中的一个7 True
1 class Chinese: 2 pass 3 4 class Cantonese(Chinese): 5 pass 6 7 gonger = Chinese() 8 yewen = Cantonese() 910print(‘\n验证1:子类创建的实例同时也属于父类‘) 11print(isinstance(gonger,Chinese)) 12print(isinstance(yewen,Chinese)) 1314print(‘\n验证2:父类创建的实例不属于子类。‘) 15print(isinstance(gonger,Cantonese)) 1617print(‘\n验证3:类创建的实例都属于根类。‘) 18print(isinstance(gonger,object)) 19print(isinstance(yewen,object)) 2021验证1:子类创建的实例同时也属于父类 22True 23True 2425验证2:父类创建的实例不属于子类。 26False 2728验证3:类创建的实例都属于根类。 29True 30 True
————————————————————————————————————————————
类的继承之多层继承
子类创建的实例可调用所有层级父类的属性和方法
1 class Earthman: 2 eye_number = 2 3 4# 中国人继承了地球人 5class Chinese(Earthman): 6 eye_color = ‘black‘ 7 8# 广东人继承了中国人,同时也继承了地球人。 9class Cantonese(Chinese): 10pass1112 yewen = Cantonese() 13print(yewen.eye_number) 14print(yewen.eye_color) 15 2 16 black
####################################################################
类的继承之多重继承
一个类,可以同时继承多个类,
语法为 class A(B,C,D):
就近原则:
越靠近子类(即越靠左)的父类,越亲近,越优先考虑。子类调用属性和方法时,会先在靠左的父类里找,找不到才往右找。
1 class Su: 2 born_city = ‘Jiangsu‘ 3 wearing = ‘thick‘ 4 5def diet(self): 6print(‘我们爱吃甜。‘) 7 8class Yue: 9 settle_city = ‘Guangdong‘10 wearing = ‘thin‘1112def diet(self): 13print(‘我们吃得清淡。‘) 1415class Yuesu(Yue,Su): 16pass1718 xiaoming = Yuesu() 19print(xiaoming.wearing) # 先在 Yue类找,找到了,打印出来。20print(xiaoming.born_city) # Yue类没有born_city,才去Su类找。21 xiaoming.diet() # 方法调用,和属性调用一样,也符合就近原则。2223thin 24Jiangsu 25 我们吃得清淡。
类的定制
定制,可以新增代码
1 class Chinese: 2 eye = ‘black‘ 3 4def eat(self): 5print(‘吃饭,选择用筷子。‘) 6 7class Cantonese(Chinese): # 类的继承 8 native_place = ‘guangdong‘# 类的定制 910def dialect(self): # 类的定制11print(‘我们会讲广东话。‘) 1213 yewen = Cantonese() 14print(yewen.eye) # 父类的属性能用15print(yewen.native_place) # 子类的定制属性也能用16 yewen.eat() # 父类的方法能用17 yewen.dialect() # 子类的定制方法也能用1819black 20guangdong 21吃饭,选择用筷子。 22 我们会讲广东话。
定制,也可重写代码
在子类中,对父类代码的修改
子类继承父类方法的操作是在def语句后接父类.方法(参数)
1 class Chinese: 2 3 def land_area(self,area): 4 print(‘我们居住的地方,陆地面积是%d万平方公里左右。‘% area) 5 6class Cantonese(Chinese): 7# 间接对方法进行重写 8def land_area(self, area, rate = 0.0188): 9 Chinese.land_area(self, area * rate) 10# 直接继承父类方法,再调整参数。1112 gonger = Chinese() 13 yewen = Cantonese() 14 gonger.land_area(960) 15 yewen.land_area(960)
提示:初始化方法的定制,和一般的实例方法的定制是一样的。
1 class Chinese: 2 def __init__(self, greeting=‘你好‘, place=‘中国‘): 3 self.greeting = greeting 4 self.place = place 5 6def greet(self): 7print(‘%s!欢迎来到%s。‘ % (self.greeting, self.place)) 8 9# 请为子类完成定制,代码量:两行。10class Cantonese(Chinese): 11def__init__(self, greeting=‘雷猴‘, place=‘广东‘): #重写代码最好是在继承方法的基础上通过代码的调整完成定制12 Chinese.__init__(self, greeting ,place) 1314 yewen = Cantonese() 15yewen.greet() 16 雷猴!欢迎来到广东。
###################################################################################################################
列子
1 class Student: 2 def __init__(self, name, job=None, time=0.00, time_effective=0.00): 3 self.name = name 4 self.job = job 5 self.time = time 6 self.time_effective = time_effective 7 8def count_time(self, hour, rate): 9 self.time += hour 10 self.time_effective += hour * rate 1112class Programmer(Student): 13def__init__(self, name): #此处为啥只留name参数,因为没有给出默认值,需要传入参数,不能省略,然后其他都是默认参数14 Student.__init__(self, name, job=‘programmer‘, time=0.00, time_effective=0.00) 1516def count_time(self, hour, rate=1): 17 Student.count_time(self, hour, rate) 1819 student1 = Student(‘韩梅梅‘) 20 student2 = Programmer(‘李雷‘) 2122print(student1.job) 23print(student2.job) 2425 student1.count_time(10, 0.8) 26 student2.count_time(10) 2728print(student1.time_effective) 29print(student2.time_effective)
原文:https://www.cnblogs.com/CH-TNT/p/11332846.html
内容总结
以上是互联网集市为您收集整理的Python 【类与对象】全部内容,希望文章能够帮你解决Python 【类与对象】所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。