面向过程、面向对象
面向过程 |
|
面向对象 |
|
类、对象
类:是具有一组相同或者相 特征(属性)和行为(方法)的一系列对象。也就是一个模板,在模板里可以包含多个函数,函数里实现一些功能。
现实世界 | 计算机世界 |
行为 | 方法 |
特征 | 属性 |
对象:是实实在在存在的一个东西,类的实例化(具象化)根据模板创建的实例,通过实例对象可以执行类中的函数。
- 类是对象的抽象化,对象是类的实例化
- 类相当于制造汽车的图纸,图纸制造的汽车相当于对象
- 类的组成结构:类名、类的属性、类的方法
定义类和对象
- 实例方法:在【类的内部】,使用def 关键字可以定义一个实例方法,第一个参数是self
- 与一般函数定义不同,类方法必须包含参数self(是一个关键字,是什么无所谓,但是必须要有), 如:类Person中的eat和run.
- 类的方法归于类的实例所有
- 类属性:在类里面、方法外面的属性
- 类属性是大部分共有的属性,比如猫毛。但可能有特殊部分和属性不同,比如无毛猫,就不能用类属性,需要实例属性
- 实例属性:在方法内部定义的【通过类似于self.变量名】引用的属性称之为实例属性
- 有实例方法就会有实例属性,实例属性归属于实例方法【_init_函数】
class Person: #类名--首字母建议大写
'''
类的属性: 对应人的特征
'''
name='小明' #类属性
age=20 #类属性
'''
类的方法【实例方法】: 对应人的行为
'''
def __init__(self):
self.height=187 #height是实例属性,和类属性不要重名
pass
def eat(self): #行为
print("大口的吃饭")
pass
def run(self):
print("飞快的跑") #实例方法
pass
xm=Person() #创建一个对象:小明
xm.eat() # 调用实例方法(类的行为)
xm.run()
print('{}的年龄是{},身高是{}'.format(xm.name,xm.age,xm.height)) #访问类的属性
魔术方法:__init__方法
__init__方法是一个初始化方法,实例化对象的时候自动调用,完成一些初始化设置。
class People(): #定义一个简单的类,没有定义类属性
def __init__(self,name,sex,age): #括号中的参数信息在创建对象的时候给出
self.name=name #实例属性的初始值 成为一个参数
self.sex=sex
self.age=age
pass
'''
实例方法:吃的行为
'''
def eat(self,food): #self相当于创建的实例对象本身,food参数需要在调用eat函数时给出
print(self.name+'喜欢吃'+food)
#print('{}喜欢吃{}'.format(self.name,food))
pass
zp=People('张鹏','男',19) #创建对象zp,并给出实例属性中参数需要的数据
print(zp.name,zp.age,zp.sex) #打印对象zp的属性
zp.eat('香蕉') #调用实例方法,此时需要给出实例方法eat的参数food的数据--香蕉
lh=People('李辉','男',27)
print(lh.name,lh.age,lh.sex)
lh.eat('橘子')
xh=People('小花','女',38)
print(xh.name,xh.age,xh.sex)
xh.eat('榴莲')
总结【__init__方法】:
- python自带的内置函数 具有特殊的函数 使用双下划线包起来的魔术方法
- 是一种初始化方法,主要用来定义一些 实例属性和初始化数据的,在创建对象时自动调用的,不需要手动调用
- 利用其传参的机制,可以让我们的定义功能更加强大并且方便
self 理解
- self和对象是同一个内存地址,可以认为self就是对象的引用----self代表的就是实例对象本身
class Person:
def __init__(self,pro): #有两个参数,第二个参数在 对象创建时给出
self.pro=pro #实例属性的定义
pass
def eat(self,name,food): #可以是self,也可以是其他
# print('self=%s'%id(self))
print('%s喜欢吃%s,专业是%s'%(name,food,self.pro))
pass
pass
xm=Person('心理学') #创建实例对象,参数是 _init_ 里的参数
#print('对象xm的地址{}'.format(id(xm)))
# 实例方法中self的内存地址 = 实例对象的内存地址
# self代表的就是实例对象本身,
xm.eat('小王','榴莲') #如果定义的实例方法中只有self一个参数时,调用时不需要传递任何参数的(self代表的就是对象),直接调用即可
小结【self特点】:
- self只有在类中定义实例方法的时候才有意义,在调用的时候不必传入相应参数,而是由解释器自动指向所创建的对象
- self的名称是可以更改的,可以定义成其他的名字,只是约定俗成的定义成了 self
- self指的是 类实例对象本身,相当于java中的this
魔术方法:__str__方法
如果没有使用 __str__方法,我们直接打印对象,输出结果只是遗传类似id地址的信息,例如打印对象xm:
print(xm) #输出<__main__.Person object at 0x000001B355BFD180>
使用 __str__方法,可以输出具体的内容,使用方法如下【具体看以下】:
# 在类中作为实例方法使用
def __str__(self):
return '%s喜欢吃%s,专业是%s'%(self.name,self.food,self.pro)
pass
#必须要有return
魔术方法:__new__方法
new魔法方法中,如果类中使用:
def __new__(cls, *args, **kwargs):
print('----new函数执行-----')
#不写 return object.__new__(cls)
#输出:
----new函数执行----- #执行了new函数
None #但没有执行init函数,说明对象没有创建成功
完整代码:
class Person:
def __init__(self,pro,name,food): #有两个参数,第二个参数在 对象创建时给出
'''
:param pro:专业
:param name: 姓名
:param food: 食物
'''
self.pro=pro #实例属性的定义
self.name=name
self.food=food
print('------init函数执行----')
pass
'''
定义类
'''
def eat(self): #可以是self,也可以是其他
'''
实例方法
:return:
'''
# print('self=%s'%id(self))
print('%s喜欢吃%s,专业是%s'%(self.name,self.food,self.pro))
pass
def __str__(self): #魔术方法:直接输出对象的时候可以输出内容,不是地址
'''
打印对象 自定义对象 是内容格式的,并非内存地址格式
:return:
'''
return '%s喜欢吃%s,专业是%s'%(self.name,self.food,self.pro)
pass
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法 每调用一次就会生成一个新的对象 cls就是class的缩写
场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
:param args:
:param kwargs:
'''
print('----new函数执行-----')
return object.__new__(cls) #创建一个对象(cls类中),并且返回给init函数中【必须有return】
xm=Person('心理学','小明','榴莲') #创建实例对象,参数是 _init_ 里的参数
print(xm) #直接输出对象(内容格式)。如果没有_str_实例方法,直接输出的就是地址
#输出:
----new函数执行-----
------init函数执行----
小明喜欢吃榴莲,专业是心理学
__new__和 __init__函数的区别
- __new__ 类的实例化方法:必须要返回该实例,否则对象创建不成功
- __init__ 用来做数据属性的初始化工作 也可以认为是实例的构造方式 接收类的实例 self 并对其进行构造
- __new__ 至少要有一个参数是 cls 代表要实例化的类,此参数实例化时由python解释器自动提供,不需要认为给
- __new__ 函数执行要早于__init__函数