1、高级语言
在很多的高级面向对象语言中,会将属性和方法分为公开的(在类的外部可以使用)、
私有的(只能在类的内部使用,不能被继承)、受保护(只能在类的内部使用,可以被继承)的三类
2.python
python中类的内容本质上全部都是公开的。私有和公开都只是约定
1)私有化 - a.内容只能在类的内部使用,不能在外面使用。(效果)
b.在类中的方法名或者属性名前加'__',那么对应的属性和方法就会变成私有的。 (怎么私有化)
c.当声明类的时候在名字前加'__',内部会在这个基础前面再加'_类名'。 (私有化的本质)
2)属性保护 - 可通过在对象属性名前加'_',把这个属性标记成收保护类型;为了告诉别人这个属性在使用的时候,
不要直接用,而是通过*getter和setter来使用
a.getter - 获取对象的属性值之前想要干点儿别的事情,那么就给这个属性添加getter
第一步: 在对应的属性名前加'_'
第二步: 在@property后面声明一个函数,这个函数没有参数,有一个返回值,并且函数名是属性名去掉'_'
第三步: 获取属性值的时候,通过'对象.属性名去掉下划线'去获取属性的值
b.setter - 给属性赋值前干别的事情,就给这个属性添加setter。(想要添加setter必须先有getter)
第一步: 在对应的属性名前加'_'
第二步: 在@getter名.setter后面声明一个函数,这个函数需要一个参数,没有返回值,并且函数名是属性名去掉'_'
第三步: 给属性赋值的时候,通过'对象.属性名去掉下划线=值'的方式赋值
3.抛出异常:
a.语法:
raise 异常类型
b.说明:
raise - 关键字
异常类型 - 可以是系统提供的异常类型,也可以自定义异常类型(必须继承Exception)
4.自定义异常类型:写一个类继承Exception,然后重写__str__方法来自定义错误信息。
class WeekValueError(Exception):
def \_\_str__(self):
return '星期的值只能是1-7的整数!'
# raise WeekValueError
# ===============保护==============
class AgeError(Exception):
def __str__(self):
return '年龄要求是整数,并且范围在0~150!'
class Person1:
def __init__(self):
self._age = 0
self._week = 6
@property
def age(self):
if self._age < 18:
return self._age, '未成年'
elif self._age < 30:
return self._age, '成年'
elif self._age < 50:
return self._age, '中年'
else:
return self._age, '老年'
@age.setter
def age(self, x):
if not isinstance(x, int):
raise AgeError
elif not 0 < x <= 150:
raise AgeError
self._age = x
@property
def week(self):
weeks = ['周1', '周2', '周3', '周4', '周5', '周6', '周日']
return weeks[self._week - 1]
@week.setter
def week(self, x):
if not isinstance(x, int):
raise ValueError
elif not 1 <= x <= 7:
raise ValueError
self._week = x
p1 = Person1()
p1.week = 1 # 本质是在调用setter对应的方法
print(p1.week) # 本质是在调用getter对应的方法
p1.age = 100
age, jieduan = p1.age
print(age, jieduan)