目录
一、定义类和对象
1.定义类
2.创建一个对象
2.1 创建一个实例对象并调用实例方法
2.2?创建另一个实例对象:
2.3 添加实例属性
二、__init__(self)
1. __init__(self) 声明多个实例属性
2.__init__传参? ? ? ? 改进
3 __init__总结
三、self
四、魔术方法:
__new__和__init__区别
其他魔术方法简单介绍
'''
面向对象编程:oop[object oriented programming] 是一种python编程思路
面向过程:就是我们一开始学习的,按照解决问题的步骤取写代码【根据业务逻辑去写代码】 在思考问题的时候,首先分析‘怎么按步骤去实现’,然后将问题解决拆解为若个个步骤,并将这些步骤对应成方法一部一部的最终完成功能【按步骤洗车】
面向对象:关注的是设计思维【找洗车店 给钱洗车】
从计算机角度来看:面向过程不适合做大项目,而面向对象适合做更大项目的设计
类和对象 类:类是具有一组 相同或相似特征【属性】和行为【方法】的一系列[多个]对象的集合
现实世界 ? ? ? ? ? ?计算机世界 行为----------------> 方法 特征----------------> 属性
对象:对象是实实在在的一个东西,类的实例化,具象化
类是对象的抽象化 ?而对象是类的一个实例
实例方法:在类的内部,用def 关键字定义 第一个参数默认是self【名字标识可以是其他的名字,但是这个位置必须被占用】 实例方法是归于类的实例所有
属性:定义在类内方法外的变量称为【类属性】? 在方法内部定义的【通过使用类似于self.变量名】变量 称为实例属性
'''
一、定义类和对象
1.定义类
(类结构 类名 属性 方法)
class 类名: ??? 属性 ??? 方法
class Person: # 类名一般用大驼峰命名法
'''
对应人的特征
'''
name='小明' #类属性
age=20
'''
对应人的行为
'''
def __init__(self): # __魔术方法__
self.name1='小明1' # 实例属性
pass
def eat(self): #实例方法:归实例所有
# 第一个参数默认是self【名字标识可以是其他的名字,但是这个位置必须被占用】
print('大口的吃饭')
pass
def run(self): #实例方法
print('飞速的跑')
pass
pass
注意第一个参数默认是self【名字标识可以是其他的名字,但是这个位置必须被占用】
2.创建一个对象
2.1 创建一个实例对象并调用实例方法
# 创建一个对象【类的实例化】
# 规则格式 对象=类名()
xm=Person()
xm.eat() #调用函数
xm.run()
print("{}的年龄是:{}".format(xm.name,xm.age)) #小明的年龄是:20
print("{}的年龄是:{}".format(xm.name1,xm.age)) #小明1的年龄是:20
运行结果:
2.2?创建另一个实例对象:
# 创建另一个实例对象
xw=Person() #创建出来的
xw.eat() #实例方法
2.3 添加实例属性
# 添加实例属性
xw.sex='男' # 添加实例属性 属于实例私有的属性
xw.pro='生物信息' # 添加实例属性 属于实例私有的属性
print(xw.sex)
运行结果:
# 如果有n个这样的对象被实例化 那么就需要添加很多次实例属性了 显然比较麻烦
# 引出 __init__(self)
二、__init__(self)
1. __init__(self) 声明多个实例属性
class People:
def __init__(self): # 默认被调用 #__方法名__ 为内置魔术方法
'''
实例属性的声明和初始化
'''
self.name='小倩' # 实例属性初始化
self.sex='女'
self.age='18'
pass
def eat(self): # 实例属性
'''
吃的行为
:return:
'''
print('喜欢吃猕猴挑')
pass
pass
xq=People() #此时xq已经拥有name,sex,age三种实例属性了
print(xq.name,xq.sex,xq.age)
xq.name='大倩'
xq.sex='女'
xq.age='19'
print(xq.name,xq.sex,xq.age)
运行结果:
2.__init__传参? ? ? ? 改进
# __init__传参 改进
class People:
def __init__(self,name,sex,age): # 默认被调用 #__方法名__ 为内置魔术方法
'''
实例属性的声明和初始化
'''
self.name=name # 实例属性初始化
self.sex=sex
self.age=age
pass
def eat(self,food): # 实例方法
'''
吃的行为
:return:
'''
print(self.name+'喜欢吃'+food)
pass
pass
zhangheng=People('张衡','男',22)
print(zhangheng.name,zhangheng.age) # 张衡 22
lh=People('李辉','男',18)
print(lh.name,lh.age) #李辉 18
lh.eat('苹果') #李辉喜欢吃苹果
zhangheng.eat('饺子') #张衡喜欢吃饺子
?运行结果:
3 __init__总结
1.Python 自带的内置函数 具有特殊的函数 使用双下划线包起来的【魔术方法】
2.是一个初始化的方法,用来定义实例属性 和初始化数据的,在创建对象的时候自动调用 不用手动去调用
3.利用传参的机制可以让我们定义功能更加强大并且方便的 类
三、self
# self
class PersonB:
'''
定义类
'''
def getSelf(self): #python解释器会自动把这个实例对象作为第一个参数传递给self
print('self=%s'%id(self))
pass
def eat(self,name,food):
print('%s喜欢吃%s,职业是%s'%(name,food,self.pro))
pass
def __init__(self,pro):
'''
:param pro: 专业
'''
self.pro=pro # 实例属性的定义
pass
# ld是一个新的实例化对象
ld=PersonB('生信')
ld.getSelf()
print('ld=%s'%id(ld)) # self与实例对象ld 内存地址相同
ld.eat('罗滴','水果') # 罗滴喜欢吃水果
运行结果:
python解释器会自动把实例对象作为第一个参数传递给self,可以通过后面两者内存地址相同可知,self即是ld这个实例对象的引用。
self总结:
self只有在定义 实例方法的时候才有意义,在调用不必传入相应参数,由解释器 自动去指向
self的名字是可以更改的 可以定义成其他的名字,只是约定俗成的定义成self
self 指的是 类实例对象本身,相当于java中的this关键字
四、魔术方法:
类似 __str__? ?__new__? 都是python内置的魔术方法
# 魔术方法
# __str__
# __new__
class People:
def __init__(self,name,age,food): # 默认被调用 #__方法名__ 为内置魔术方法
'''
:param name: 名字
:param age: 年龄
:param food: 食物
'''
self.name=name # 实例属性初始化
self.age=age
self.food=food
#测试
print('-------------init执行---------')
pass
def __str__(self):
'''
打印对象 自定义对象内容格式的
:return:
'''
return '%s今年%d喜欢吃%s'%(self.name,self.age,self.food)
def __new__(cls, *args, **kwargs): # 不写会自动补一个new
'''
创建对象实例的方法 每调用一次 就会生成一个新的对象 cls 就是class的缩写
场景: 可以控制创建对象的一些属性,经常用来做单例模式的时候来使用
:param args:
:param kwargs:
'''
# 测试
print('=============new执行==========')
return object.__new__(cls) # 在这里是真正创建对象实例的
pass
zhh=People('张衡',22,'汉堡')
print(zhh) # 张衡今年22喜欢吃汉堡 # 没有__str__会只输出地址 先new对象才能init
__new__和__init__区别
?__new__ 类的实例化方法 必须要返回(return)该实例 否则对象就创建不成功
?__init__ 用来做实例属性的初始化操作 也可以认为是实例的构造方法 接受类的实例 self 并对其进行构造
?__new__ 至少有一个参数 是cls 代表要实例化的类, 此参数在实例化时由python解释器自动提供
?__new__ 函数要先于__init__函数 执行
其他魔术方法简单介绍
__str__ 自定义对象内容格式的 打印对象 没有__str__会只输出地址 必须return __class__?查看对象所在的类 __del__ 析构方法 不写会自动补一个del __mro__ 方法解析顺序 ? __call__将实例对象以函数的形式调用
?
?
?
|