Python 【类与对象】

类与对象

把类的个例就叫做实例 (instance),可理解为“实际的例子”
类是某个特定的群体,实例是群体中某个具体的个体

Python中的对象等于类和实例的集合:即类可以看作是对象,实例也可以看作是对象,
比如列表list是个类对象,[1,2]是个实例对象,它们都是对象
“万事万物,皆为对象”

类的创建和调用

类的创建
类名的首字母要大写

1 class Chinese:      # 创建一个类
2     eye = ‘black‘
3
4     def eat(self):   #参数self的特殊之处:在定义时不能丢,在调用时要忽略
5         print(‘吃饭,选择用筷子。‘)
6
7 wu = Chinese()   # 类的实例化
8 print(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 = ‘吴‘  # 类属性name
4
5     def say(self):
6         print(self.name + ‘是中国人‘)
7
8 person = Chinese()   # 创建Chinese的实例person
9 person.say()         # 调用实例方法

当最后一行代码运行时,实例person会像参数一样传给self,替换掉self,self.name等价于person.name
person.name就相当于调用了类属性name(即‘吴‘),然后跑完整个方法

相当于以下:

 1 class Chinese:
 2
 3     name = ‘吴‘  # 类属性name
 4
 5     def say(person):
 6         print(person.name + ‘是中国人‘)
 7
 8 person = Chinese()   # 创建Chinese的实例person
 9 person.say()         # 调用实例方法
10 吴是中国人

如果想在类的方法内部调用其他方法时,我们也需要用到self来代表实例

 1 class Chinese:
 2
 3     def greeting(self):
 4         print(‘很高兴遇见你‘)
 5
 6     def say(self):
 7         self.greeting()
 8         print(‘我来自中国‘)
 9
10 person = Chinese()  # 创建实例person
11
12 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(‘很高兴遇见你,我是初始化方法‘)
5
6 person = Chinese()
7 很高兴遇见你,我是初始化方法

编写习惯上,我们会在初始化方法内部完成类属性的创建,为类属性设置初始值,
这样类中的其他方法就能直接、随时调用

 1 class Chinese:
 2     def __init__ (self):
 3         self.mouth = 1  # self.不能丢
 4         self.eye = 2
 5
 6     def body(self):
 7         print(‘我有%s张嘴巴‘ % self.mouth)
 8         print(‘我有%s只眼睛‘ % self.eye)
 9
10 person = Chinese()
11 person.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
 8     def born(self):
 9         print(self.name + ‘出生在‘ + self.birth)
10
11     def live(self):
12         print(self.name + ‘居住在‘ + self.region)
13
14 person = Chinese(‘吴‘,‘广东‘,‘深圳‘) # 传入初始化方法的参数
15 #初始化方法有多个参数的时候,在实例化的时候就要传入相应的值
16 person.born()
17 person.live()
18 吴出生在广东
19 吴居住在深圳

#其实还可以不用初始化方法也能实现
但是此方法比不上初始化方法
初始化优点:
至少不必重复传参,传入的数据还可以被多次调用

 1 class Chinese:
 2
 3     def born(self, name, birthplace):
 4         print(name + ‘出生在‘ + birthplace)
 5
 6     def live(self, name, region):
 7         print(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
 5         print(‘程序持续更新中……‘)
 6
 7     def born(self):
 8         print(‘我生在%s。‘%(self.hometown))
 9
10     def live(self):
11         print(‘我在%s。‘%(self.region))
12
13     # 新建方法,调用上面的两个方法(注:方法名可自定义)。
14     def citys(self):
15         self.born()
16         self.live()
17
18 wu = Chinese(‘广东‘, ‘深圳‘)
19 wu.citys()
20 # 调用方法后,程序运行方法中的代码(即依次调用方法`born`和`live`)。
21 程序持续更新中……
22 我生在广东。
23 我在深圳。

#####################################################################################################

面向对象编程
与面向对象编程相对应的是面向过程编程

面向过程编程:首先分析出解决问题所需要的步骤(即“第一步做什么,第二步做什么,第三步做什么”),
然后用函数实现各个步骤,再依次调用。

面向对象编程,将代码具体的数据和处理方法都封装在类中,让我们不用完全了解过程也可以调用类中的各种方法。
这个优势让我们可以在 Python 中轻松地调用各种标准库、第三方库和自定义模块(可以简单理解成别人写好的类)

#类编写一个直观的好处就是参数的传递会比普通函数要省事很多,也不必考虑全局变量和局部变量,因为类中的方法可以直接调用属性。
#####################################################################################################################
综合例子

 1 class Robot:
 2     def __init__(self):
 3         self.name = input(‘我现在刚诞生,还没有名字,帮我起一个吧。‘)
 4         self.master = input(‘对了,我要怎么称呼你呢?‘)
 5         print(‘你好%s,我叫%s。很开心,遇见你~‘%(self.master,self.name))
 6
 7     def say_wish(self):
 8         wish = input(‘告诉我一个你的愿望吧:‘)
 9         print(self.master+‘的愿望是:‘)
10         # 这里也可以用字符串的格式化,不过,用循环语句的话,之后改复述次数会方便些。
11         for i in range(3):
12             print(wish)
13
14 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是否为整数类的实例
3 True
4 print(isinstance(1,str))
5 False
6 print(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()
 9
10 print(‘\n验证1:子类创建的实例同时也属于父类‘)
11 print(isinstance(gonger,Chinese))
12 print(isinstance(yewen,Chinese))
13
14 print(‘\n验证2:父类创建的实例不属于子类。‘)
15 print(isinstance(gonger,Cantonese))
16
17 print(‘\n验证3:类创建的实例都属于根类。‘)
18 print(isinstance(gonger,object))
19 print(isinstance(yewen,object))
20
21 验证1:子类创建的实例同时也属于父类
22 True
23 True
24
25 验证2:父类创建的实例不属于子类。
26 False
27
28 验证3:类创建的实例都属于根类。
29 True
30 True

————————————————————————————————————————————
类的继承之多层继承

子类创建的实例可调用所有层级父类的属性和方法

 1 class Earthman:
 2     eye_number = 2
 3
 4 # 中国人继承了地球人
 5 class Chinese(Earthman):
 6     eye_color = ‘black‘
 7
 8 # 广东人继承了中国人,同时也继承了地球人。
 9 class Cantonese(Chinese):
10     pass
11
12 yewen = Cantonese()
13 print(yewen.eye_number)
14 print(yewen.eye_color)
15 2
16 black

####################################################################
类的继承之多重继承

一个类,可以同时继承多个类,
语法为 class A(B,C,D):

就近原则:
越靠近子类(即越靠左)的父类,越亲近,越优先考虑。子类调用属性和方法时,会先在靠左的父类里找,找不到才往右找。

 1 class Su:
 2     born_city = ‘Jiangsu‘
 3     wearing = ‘thick‘
 4
 5     def diet(self):
 6         print(‘我们爱吃甜。‘)
 7
 8 class Yue:
 9     settle_city = ‘Guangdong‘
10     wearing = ‘thin‘
11
12     def diet(self):
13         print(‘我们吃得清淡。‘)
14
15 class Yuesu(Yue,Su):
16     pass
17
18 xiaoming = Yuesu()
19 print(xiaoming.wearing) # 先在 Yue类找,找到了,打印出来。
20 print(xiaoming.born_city) # Yue类没有born_city,才去Su类找。
21 xiaoming.diet() # 方法调用,和属性调用一样,也符合就近原则。
22
23 thin
24 Jiangsu
25 我们吃得清淡。

类的定制
定制,可以新增代码

 1 class Chinese:
 2     eye = ‘black‘
 3
 4     def eat(self):
 5         print(‘吃饭,选择用筷子。‘)
 6
 7 class Cantonese(Chinese):  # 类的继承
 8     native_place = ‘guangdong‘  # 类的定制
 9
10     def dialect(self):  # 类的定制
11         print(‘我们会讲广东话。‘)
12
13 yewen = Cantonese()
14 print(yewen.eye)           # 父类的属性能用
15 print(yewen.native_place)  # 子类的定制属性也能用
16 yewen.eat()                # 父类的方法能用
17 yewen.dialect()            # 子类的定制方法也能用
18
19 black
20 guangdong
21 吃饭,选择用筷子。
22 我们会讲广东话。

定制,也可重写代码
在子类中,对父类代码的修改

子类继承父类方法的操作是在def语句后接父类.方法(参数)

 1 class Chinese:
 2
 3     def land_area(self,area):
 4         print(‘我们居住的地方,陆地面积是%d万平方公里左右。‘% area)
 5
 6 class Cantonese(Chinese):
 7     # 间接对方法进行重写
 8     def land_area(self, area, rate = 0.0188):
 9         Chinese.land_area(self, area * rate)
10         # 直接继承父类方法,再调整参数。
11
12 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
 6     def greet(self):
 7         print(‘%s!欢迎来到%s。‘ % (self.greeting, self.place))
 8
 9 # 请为子类完成定制,代码量:两行。
10 class Cantonese(Chinese):
11     def __init__(self, greeting=‘雷猴‘, place=‘广东‘):  #重写代码最好是在继承方法的基础上通过代码的调整完成定制
12         Chinese.__init__(self, greeting ,place)
13
14 yewen = Cantonese()
15 yewen.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
 8     def count_time(self, hour, rate):
 9         self.time += hour
10         self.time_effective += hour * rate
11
12 class Programmer(Student):
13     def __init__(self, name): #此处为啥只留name参数,因为没有给出默认值,需要传入参数,不能省略,然后其他都是默认参数
14         Student.__init__(self, name, job=‘programmer‘, time=0.00, time_effective=0.00)
15
16     def count_time(self, hour, rate=1):
17         Student.count_time(self, hour, rate)
18
19 student1 = Student(‘韩梅梅‘)
20 student2 = Programmer(‘李雷‘)
21
22 print(student1.job)
23 print(student2.job)
24
25 student1.count_time(10, 0.8)
26 student2.count_time(10)
27
28 print(student1.time_effective)
29 print(student2.time_effective)

原文地址:https://www.cnblogs.com/CH-TNT/p/11332846.html

时间: 2024-11-01 00:24:12

Python 【类与对象】的相关文章

python 类和对象的属性

python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性,父类和子类的类属性都会被改变. 3. 子类继承父类的类属性可以通过类名+属性名使用,但是一旦发生赋值,就会新定义一个相同名字的子类自己的类属性. 4. 类的对象可以通过对象名+属性名使用类属性,但是一旦发生赋值,就会新定义一个相同名字的对象属性,而且不会被继承. eg: >>> class

python类与对象各个魔法方法总结

1.python类与对象各个魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常.因此,现在我们要求定义一个 Nstr 类,支持字符串的相减操作:A – B,从 A 中去除所有 B 的子字符串. class Nstr(str): def __sub__(self,other):  self=list(self)         other=list(other) for i in ot

python类与对象基本语法

本文和大家分享的主要是python中类与对象相关内容,一起来看看吧,希望对大家学习python有所帮助. 面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象. 定义一个类 class person: age=10 #下面sex没有进行初始化是会报错的 #sex name="intsmaze" def getPe

Python 类与其对象的创建和应用

1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.name=a_name self.dob=a_dob self.times=a_times >>> sarah=Athlete('Sarah Sweeney','2002-07-02',['2:58','2.34','1

python类和对象-扩展

1.为类或对象动态创建属性或方法 2.__slots__ = ('name','age'),[实例]只能创建指定的属性属性或方法 ---新式类 3.执行父类的构造函数的不同Father.__init__(self) --经典类super(Son,self).__init__() --新式类 4.Person.__bases__ 只会显示一层继承的所有父类5.__call__ __call__ 一个已经实例化的对象p,在调用p()6.python中一切都是对象,类本身也是对象,类是由type产生的

Python 类和对象-上

#类和对象 class Human: #属性 -> 成员属性(变量) ear = 2 mouth = 1 sex = 'man' age = 28 name = 'zhangwang' married = False color = 'yellow' #特征 -> 成员方法(函数) def walk(self): print('直立行走') def eat(self): print('吃饭') def sleep(self): print('睡觉') def playgame(self): p

python类与对象的组合与继承

1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承用于"是一个"的场景中.例如,水池里有一个乌龟,天上有一个鸟,地上有一个小甲鱼,这些适合使用组合.青瓜是瓜,女人是人,鲨鱼是鱼,这些就应该使用继承啦实例如下: class Turtle: def __init__(self,x): self.num = x class Fish: def

python类和对象理解

类的概念 类(class)抽象的概念,比如说人类.鸟类.水果.是一个总的称呼,没有具体到某个物体: 对象(object,指具体实例,instance): 类定义的语法: class 类名: 执行语句 类变量 类方法 类最重要的两部分就是类变量和类方法,类成员之间的可以相互调用. 程序可以在类中给新变量赋值就是增加类变量,可以通过del语句删除已有类的变量. 在__init__构造函数(构造函数后面会说到)里面的是实例变量,程序可以任何位置(类里面或者类外面)增加实例变量,删除则用del语句. 在

第13课 python 类与对象1

今日我们开始 学习类 & 对象.....(上个课时,我们只是说了debug,这种技能,只能说概念,真正debug,还是要自己动手) 学习很多对象语言,我自己都很模糊,什么事对象编程语言.....但是学python后,就清晰了... 类 对象 类:我们从人类,男 女 去区分. ####说明类 是一个 分类,有男人,女人相同的特征,共同的属性..所以 我们叫做类: ####在python 中 分 字符,整数,浮点类,这些类,其实说白了是一种概念化的内容.类下面是对象(具体的每个) ####还是不可以

Python类和对象

在设计之初,Python 就被设计成支持面向对象的编程语言,因此 Python 完全能以面向对象的方式编程.而且 Python 的面向对象比较简单,它不像其他面向对象语言提供了大量繁杂的面向对象特征,它致力于提供简单.够用的语法功能. 正因为如此,在 Python 中创建一个类和对象都很容易.Python 支持面向对象的三大特征:封装.继承和多态,子类继承父类同样可以继承到父类的变量和方法. 面向对象相关术语 在系统学习面向对象编程之前,初学者要了解有关面向对象的一些术语.当和其他人讨论代码的时