封装
- 封装定义:隐藏对象的部分属性和方法,仅对外提供公共的访问方式
- 格式:__属性,__方法名
- 特点:私有属性和私有方法只能在类的内部调用
下面是一个普通的封装类实例化:
class Person(object):
def set_name(self, new_name):
self.new_name = new_name
def get_name(self):
return self.new_name
def set_age(self, new_age):
if new_age < 0 or new_age > 130:
print("这个不科学")
self.new_age = 0
else:
self.new_age = new_age
def get_age(self):
return self.new_age
def __str__(self):
return ("姓名:%s\t年龄:%d" % (self.new_name, self.new_age))
person = Person()
person.set_name("张三")
person.set_age(-1)
per_name = person.get_name()
per_age = person.get_age()
print(per_name, per_age)
print(person)
私有属性
-
格式:__属性名 = 值
-
特点:普通对象属性,类外面可以任意修改;私有属性,类外面不能使用,对象不能调用私有属性
class Person(object):
def set_name(self, new_name):
self.new_name = new_name
def get_name(self):
return self.new_name
def set_age(self, new_age):
if new_age < 0 or new_age > 130:
print("这个不科学")
self.new_age = 0
else:
self.new_age = new_age
def get_age(self):
return self.new_age
def __str__(self):
return ("姓名:%s\t年龄:%d" % (self.new_name, self.new_age))
person = Person()
person.set_name("张三")
person.set_age(-1)
per_name, per_age = person.get_name(), person.get_age()
print(per_name, per_age)
print(person)
person.new_age = 22
print(person)
但我们将对象属性私有化之后就可一解决这个问题了。
class Person(object):
def set_name(self, new_name):
self.new_name = new_name
def get_name(self):
return self.new_name
def set_age(self, new_age):
if new_age < 0 or new_age > 130:
print("这个不科学")
self.__new_age = 0
else:
self.__new_age = new_age
def get_age(self):
return self.__new_age
def __str__(self):
return ("姓名:%s\t年龄:%d" % (self.new_name, self.__new_age))
person = Person()
# 创建person对象,给私有属性赋值
person.set_name("张三")
person.set_age(-1)
per_name, per_age = person.get_name(), person.get_age()
print(per_name, per_age)
print(person)
# 想修改私有属性的值,但是会无效
person.__new_age = 22
print(person)
私有方法
- 格式:__方法名
- 作用:保护核心代码
- 特点:对象不能调用私有方法,只能在类的内部调用
例子:
class Call(object):
def __init__(self, money):
self.money = money
def __call(self):
if self.money > 0:
return "正在呼叫。。。"
else:
return "您的电话已停机。。。"
def call(self):
return self.__call()
# 类实例化
phone = Call(-9)
# call()内部调用__call方法
result = phone.call()
print(result)
# 尝试调用私有方法__call
result2 = phone.__call()
print(result2)
私有化封装的本质与限制
- 本质:在python中实现的封装操作,不是通过权限限制而是通过改名实现的,只是名字变了找不到了而已
- 查看对象属性:对象._dict_
- 私有属性、方法访问限制:
位置 | 访问限制 |
---|---|
类中 | 可以访问 |
类/对象外 | 不可以访问 |
子类/子类对象 | 不可以访问 |
查看对象所有属性
对象._dict_
class Parent():
def __init__(self,name,password,tpassword):
self.name = name
self.password = password
self.__tpassword = tpassword
def login(self):
if self.__tpassword == self.password:
return True
else:
return False
Parents = Parent("李自成","123456","123456")
print(Parents.__dict__)
print(Parents.login())
类外访问私有属性(可以但不允许这么操作)
对象._类名+私有属性
class Parent():
def __init__(self, name, password, tpassword):
self.name = name
self.password = password
self.__tpassword = tpassword
def login(self):
if self.__tpassword == self.password:
return True
else:
return False
Parents = Parent("李自成", "123456", "123456")
print(Parents._Parent__tpassword) # 访问私有属性
类外修改对象私有属性(可以但不允许这么操作)
class Parent():
def __init__(self, name, password, tpassword):
self.name = name
self.password = password
self.__tpassword = tpassword
def login(self):
if self.__tpassword == self.password:
return True
else:
return False
Parents = Parent("李自成", "123456", "123456")
print(Parents.__dict__)
print(Parents.login())
Parents._Parent__tpassword = 90 #修改私有属性
Parents._Parent__tname = "李闯" # 增加私有属性
print(Parents.__dict__)
print(Parents.login())