面向对象之封装、多态、反射
面向对象之封装
封装:将数据和功能‘封装’起来
隐藏:将数据和功能隐藏起来不让用户直接调用,并开发一些接口间接调用,而且可以在接口内添加一些额外的操作
伪装:将类里面的方法伪装成类里面的数据
隐藏
class A:
a = 1
_b = 2
__c = 3
print(A.a)
obj = A()
print(obj.a)
print(obj._b)
print(obj.__c)
print(A._b)
print(A.__c)
print(obj._A__c)
如果想让对象也拥有隐藏属性的话同样的也是需要在类定义阶段就弄好
obj.__name = 'zyg'
print(obj.__name)
class Person:
def __init__(self, name, age, hobby):
self.__name = name
self.__age = age
self.__hobby = hobby
def get_info(self):
print(f"""
姓名:{self.__name}
年龄:{self.__age}
爱好:{self.__hobby}
""")
def set_name(self, new_name):
if len(new_name) == 0:
raise ValueError('你好歹写点东西')
if new_name.isdigit():
raise ValueError('名字不能是数字')
self.__name = new_name
obj = Person('zyg', 18, 'None')
obj.get_info()
obj.set_name('json')
obj.get_info()
伪装
我们在定义一个类以后,如果想要调用类里面的方法是需要加括号的
class Person:
def __init__(self, name, age, hobby):
self.__name = name
self.__age = age
self.__hobby = hobby
def get_info(self):
print(f"""
姓名:{self.__name}
年龄:{self.__age}
爱好:{self.__hobby}
""")
obj = Person('zyg', 18, 'read')
obj.get_info()
class Foo:
def __init__(self, val):
self.__NAME = val
@property
def name(self):
return self.__NAME
@name.setter
def name(self, value):
self.__NAME = value
@name.deleter
def name(self):
raise PermissionError('Can not delete')
obj = Foo('zyg')
print(obj.name)
obj.name = 'lxj'
print(obj.name)
面向对象之多态
面向对象中多态的意思是一种事物可以有多种形态,但是针对相同的功能应该定义相同的方法,这样无论我们拿到哪种状态的事物都可以通过相同的方法调用功能
eg:
在Linux系统中文件、内存、硬盘都是可以读取数据和保存数据的,那么在对他们定义时可以定义相同的读取和写入方法
class File:
def read(self): pass
def write(self): pass
class Memory:
def read(self): pass
def write(self): pass
class Disk:
def read(self): pass
def write(self): pass
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass
class Cat(Animal):
def talk(self):
pass
cat = Cat()
面向对象之反射
利用字符串操作对象的数据与方法,主要用于与用户交互
操作方法
1.hasattr() 判断对象是否含有某个字符串对应的属性名或方法名
2.getattr() 根据字符串获取对象对应的属性或方法
3.setattr() 根据字符串设置对象或者修改数据
4.delattr() 根据字符串删除对象中的名字
正常情况下我们修改数据是使用变量名来修改对应的数据,但是用户输入使用的是 input 输入的是字符串类型的数据,字符串'name'和变量名 name的差别还是很大的,这种情况下我们就可以利用反射来操作
class C1:
school_name = '小姐姐学院'
def choice_course(self):
print('大宝贝们正在选课')
obj = C1()
while True:
target_name = input('请输入您想要操作的名字>>>:')
if hasattr(obj, target_name):
print('恭喜您 系统中有该名字')
data_or_func = getattr(obj, target_name)
if callable(data_or_func):
print('您本次使用的是系统中的某个方法')
data_or_func()
else:
print('您本次使用的是系统中的某个数据')
print(data_or_func)
else:
print('很抱歉 系统中没有该名字')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)