oop 面向对象程序开发

本文深入讲解面向对象编程(OOP)的基础知识,包括类的定义、实例化、成员属性与方法,以及封装、继承和多态等核心概念。通过具体实例,阐述了如何在Python中实现OOP,以及对象和类如何调用公有和私有成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oop 面向对象程序开发

在外部,对象调用方法时,对象会作为参数传进去,所以在调用方法时,方法中必须要有self参数,类调用方法时,类不会作为参数传进去,所以为了一一对应,方法中有self,类也必须要加参数
在内部,私有属性和公有属性对象和类都可以调用,调用方法时,要看有没有参数,有参数要用self,没参用类调,要形成一一对应.

(1)类的定义

class Car:
	pass

class Car(): # (推荐)
	pass

class Car(object):
	pass

(2)类的实例化

class Car():
	pass
obj = Car()

(3)类的基本结构

"""
类中只有2种成员:
	(1) 成员属性
	(2) 成员方法
"""
class Car():
	# 成员属性
	color = "屎黄色的"
	# 成员方法
	def func():
		print("小车会跑")

反例

"""
类中的代码可以直接执行,但是严禁使用,不要直接把代码裸露在类中
应该把相应的逻辑放在成员方法当中处理;
"""
class Car():
	if 5 == 5:
		print(4567)

正确的方法

class Car():
	def func():
		if 5 == 5:
			print(4567)

(4)类的命名

"""
类的命名推荐使用大驼峰命名法
mycar => MyCar
dahuangfeng => DaHuangFeng
"""

面向对象oop - 封装

类中封装:
	成员属性 
	成员方法

封装等级:
	1.公有 : 公有成员既能够在类外调用,也可在类内调用
	2.私有 : 私有成员不能够在类外调用,可以在类内调用

调用语法:
	对象.属性
	对象.方法


类中的绑定方法 (方法在类的内部)
	(1) 绑定到对象 (对象调用方法时,系统自动把该对象当成参数进行传递.)
	(2) 绑定到类   (对象或者类调用方法时,系统自动把该类当成参数进行传递)



class MyCar():
	# 公有成员属性
	color = "屎黄色的"
	# 私有成员属性
	__logo = "五菱宏光"

	# 公有成员方法
	def drive(self):
		print("我的小车可以跑高速,可以泡妹子",self.color)

	# 私有成员方法
	def __info():
		print("我的价格是保密的,我的油耗也是保密的")
	
类的实例化
obj = MyCar()
对象的相关操作

###实例化的对象访问公有成员属性和方法

 调用属性
print(obj.color)
 调用方法
对象调用方法时,系统会自动把该对象当成参数传递到该方法中
为了保证形参实参一一对应,在定义方法时候,要加形参self,这个方法也叫绑定	方法(绑定到对象)

obj.drive()
 调用私有成员
 obj.__logo  error

###实例化的对象动态添加公有成员属性和方法

添加成员属性

obj.color = "武士黑"

dict 查看对象或者类当中的成员,返回一个字典

print(obj.__dict__)
print(obj.color)
obj.drive()

添加成员方法

#只要有参数就用types  (可以传递对象中的参数)★★★★★
#没有参就用lambda 例如obj.wei=lambda :print('你好好,我叫大黄蜂')★★★★★

(1) 动态添加无参方法

def dahuangfeng():
	print("变形!请叫我大黄蜂")

对象.属性(自定义的) = 方法

obj.dahuangfeng = dahuangfeng
obj.dahuangfeng()

(2) 动态添加有参方法

1.基础版

def qingtianzhu(name):
	print("变形!请叫我一柱擎天,简称{}".format(name))

对象.属性(自定义的) = 方法

obj.qingtianzhu = qingtianzhu
obj.qingtianzhu("擎天柱")

2.升级版

def qingtianzhu(obj,name):
print("变形!请叫我一柱擎天,简称{},我的颜色是{}".format(name , obj.color))

对象.属性(自定义的) = 方法

obj.qingtianzhu = qingtianzhu
obj.qingtianzhu(obj,"擎天柱")

3.高级版(创建一个绑定方法,自动传递obj对象) 在类外,让系统自动帮助传递obj这个对象参数

import types

def qingtianzhu(self,name):
print("变形!请叫我一柱擎天,简称{},我的颜色是{}".format(name , self.color))
通过MethodType 来创建一个绑定方法,自动传递obj对象
types.MethodType(函数,对象) 当调用方法时,自动把对象当成参数传递给该方法.
obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
obj.qingtianzhu("擎天柱")

(3) 动态添加lambda 匿名函数

obj.weizhentian = lambda : print("变形! 请叫我威震天")
obj.weizhentian()


print(obj.__dict__)

### 类的相关操作

class MyCar():
	# 公有成员属性
	oil = "2.0T"
	# 私有成员属性
	__price = "5000万"

	# 公有无参方法
	def oil_info():
		print("我的油耗是百公里1000升,发动机是2.0T")
	
	# 私有无参方法
	def __price_info():
		print("我的价格信息")

###定义的类访问公有成员属性和方法

print(MyCar.oil)
MyCar.__price error==>不能在类外调用
MyCar.oil_info()

###定义的类动态添加公有成员属性和方法

添加公有成员属性

MyCar.logo = "兰博基尼"
print(MyCar.__dict__)

添加公有成员方法

#都用lambda表达式

(1) 动态添加公有无参方法

def fangxiangpan():
	print("制造方向盘的方法")
	 类.成员(自定义名字) = 方法
MyCar.fangxiangpan = fangxiangpan
MyCar.fangxiangpan()

(2) 动态添加公有有参方法

def engine(dongli):
	print("我的发动机是%s"%(dongli))

MyCar.engine = engine
MyCar.engine("四缸发动机")

(3) 动态添加lambda表达式

MyCar.luntai = lambda pinpai : print("我的轮胎使用的品牌是%s" % pinpai)
MyCar.luntai("米其林")

print(MyCar.__dict__)

### 类和对象之间的注意点

"""
类中的成员只归属于当前这个类本身
对象可以调用其中的公有成员,但是没有修改和删除的权利,因为都归属于类,不是对象中的成员
类无法调用对象中的相关成员,但是对象可以调用类中的相关成员.
"""

对象调用类中成员

"""
调用对象中的成员时,先看看自己有没有该成员,
如果有,那么就先调用自己的
如果没有,那么就调用类的.
"""
obj2 = MyCar()
print(obj2.logo)
obj2.logo = "布加迪威龙"
print(obj2.logo)
print(obj2.__dict__)

类调用对象中的成员

print(MyCar.logo)==>不可以

### 类中的私有成员

class Plane():
	# 公有成员属性
	captain = "魏富强"
	# 私有成员属性
	__airsistem = 3

	# 公有绑定方法
	def fly(self):
		print("飞机会飞,百公里油耗2万升1")
	
	# 公有无参方法
	def fly2():
		print("飞机会飞,百公里油耗2万升2")

	# 私有绑定方法
	def __plane_info(self):
		print("飞机上的空姐数量是保密的,个数%d" % (self.__airsistem))

	# 私有无参方法
	def __plane_info2():
		print("飞机上的空姐数量是保密的,个数%d" % (Plane.__airsistem))

	# 用pub_info调用私有成员属性和方法
	def pub_info(self):
		print(self.__airsistem) # 3
		self.__plane_info()
	
	def pub_info2():
		print(Plane.__airsistem)
		Plane.__plane_info2()

obj = Plane()
obj.fly()
Plane.fly2()
print(Plane.__dict__)

私有成员的改名策略 [_类名__成员名] (不推荐)

print(obj._Plane__airsistem)
print(Plane._Plane__airsistem)

obj._Plane__plane_info()
Plane._Plane__plane_info2()

利用类内的公有方法间接调用私有成员 (推荐)

#先在里面添加公有方法,然后在公有方法内部定义私有成员,(看是否有参数,有参数用参数定义,没有参数用类定义)然后调用公有方法就可以★★★★★
#在类的内部,可以调用私有成员,有参用参,没参用类★★★★★
#在类的外部没参数只能用类调用公有成员★★★★★
obj.pub_info()
Plane.pub_info2()

### 删除相关成员

实例化的对象删除公有成员属性和方法

obj.captain = "王聪"
print(obj.__dict__)

删除属性

del obj.captain
print(obj.__dict__)

如果对象有该成员,先调用自己的,没有的话,调用类的.如果都没有,报错

print(obj.captain)

删除方法

obj.func = lambda : print("开飞机是为了泡妞")
obj.func()
Plane.func() error
del obj.func
obj.func() error

定义的类删除公有成员属性和方法

删除属性

del Plane.captain
print(Plane.captain)
obj.captain  error # 对象和类当中,没有 captain 成员

删除方法

del Plane.fly
obj.fly() error
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值