一、面向对象之封装
在类定义时对变量名(方法名)之前加上_ _来进行封装,封装可以隐藏该变量,使对变量的直接调用失效,让对该变量的调用只能通过内部提供接口来实现,封装可以让代码被隔离起来,从外部调用使用接口才能改变封装的对象。实质上就是python将 _ _开头的变量名(方法名)的名称空间改变为了 _ 类名 _ _变量名(方法名)。
class A(object):
name = "bbc"
__money = 28
a = A()
print(a.name)
print(a.__money)
此时无法直接调用__money变量
class A(object):
name = "bbc"
__money = 28
def get_money(self):
return self.__money
a = A()
print(a.get_money()) # 通过类中的接口获取
print(a._A__money) # 按照封装的语法获取
此时通过类中编写的接口可以直接使用,通过封装语法也能调用,但一般会遵从接口调用的形式
二、property
@property可以将对应方法伪装为变量
class Change(object):
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
@property
def division(self):
num1 = int(self.num1)
num2 = int(self.num2)
return "%s除以%s,商%s,余%s"%(num1, num2, num1/num2, num1%num2)
change = Change(5,2)
print(change.division)
三、面向对象之多态
一个类的多种形态
class Subject(object):
def get_teacher(self):
pass
class Matchs(Subject):
def get_teacher(self):
return "bbc"
class Chinese(Subject):
def get_teacher(self):
return "kkx"
matchs = Matchs()
chinese = Chinese()
print(matchs.get_teacher())
print(chinese.get_teacher())
同一种事物的不同形态换成代码就是同一个类被其他类继承后其中的变量、函数被重写,就是面向对象的多态。面向对象的多态性需要开发者自己遵守,不过python提供了强制的措施来实现,但一般是不推荐这么做的。
import abc
class Subject(object, metaclass=abc.ABCMeta): # 添加上metaclass=abc.ABCMeta
@abc.abstractmethod # 使用@abc.abstractmethod让子类必须实现该函数
def get_teacher(self):
pass
class Matchs(Subject):
def get_teacher(self):
return "bbc"
class Chinese(Subject):
def get_teacher(self):
return "kkx"
matchs = Matchs()
chinese = Chinese()
print(matchs.get_teacher())
print(chinese.get_teacher())
四、反射
反射就是通过字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员
1.hasattr
判断对象中是否有这个方法或变量
class Assion(object):
name = "bbc"
def get_as(self):
print("from Assion in get_as")
print(Assion.__dict__)
print(hasattr(Assion, "get_as"))
2.getattr
获取对象中的方法或变量的内存地址
class Assion(object):
name = "bbc"
def get_as(self):
print("from Assion in get_as")
print(Assion.__dict__)
print(getattr(Assion, "name"))
3.setattr
为对象添加变量或方法
class Assion(object):
name = "bbc"
def get_as(self):
print("from Assion in get_as")
print(Assion.__dict__)
setattr(Assion, "age", 18)
print(Assion.__dict__)
4.delattr
删除对象中的变量。注意:不能用于删除方法
class Assion(object):
name = "bbc"
def get_as(self):
print("from Assion in get_as")
print(Assion.__dict__)
delattr(Assion, "name")
print(Assion.__dict__)