1、私有属性的一个用法:
class Room:
def __init__(self, name, length, width):
self.name = name
self.__length = length
self.__width = width
def area(self):
return self.__length * self.__width
wei = Room('Wei', 2, 1)
print(wei.area())
2、getter和setter:对私有变量进行保护。
class Room:
def __init__(self, name, length, width):
self.__name = name
self.__length = length
self.__width = width
def get_name(self):
return self.__name
def set_name(self, newName):
if type(newName) is str and newName.isdigit() == False: # 非数字字符串
self.__name = newName
else:
print("不合法的姓名")
def area(self):
return self.__length * self.__width
wei = Room('Wei', 2, 1)
wei.set_name('2')
print(wei.get_name())
3、问:父类的私有属性能被子类调用么?不能被子类调用。
class Foo:
__key = 123 # _Foo__key
class Son(Foo):
print(Foo.__key) # _Son__key
结果:
总结:会使用到私有这个概念的场景:
1)隐藏一个属性、不想让类的外部调用;
2)我想保护这个属性,不想让属性随意被改变;
3)我想保护这个属性不被子类继承。
3、property:
内置装饰器函数,只在面向对象中使用。
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
from math import pi
class Circle:
def __init__(self, r):
self.r = r
@property
def perimeter(self):
return pi * self.r * 2
@property
def area(self):
return pi * self.r * self.r
c1 = Circle(5)
print(c1.area) # 圆的面积
print(c1.perimeter) # 圆的周长
将方法伪装成一个属性。
注意:方法里不能传参数。
为什么要使用@property?
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉到自己的名字是执行了函数然后计算出来的,这种特性的使用遵循了统一访问的原则。
ps:面向对象的封装有三种方式:
【public】
这种其实就是不封装,是对外公开的
【protected】
这种封装方式对外不公开,但对朋友(friend)或者子类公开
【private】
这种封装对谁都不公开
class Person:
def __init__(self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight / self.height ** 2
chang = Person('chang', 1.8, 83)
print(chang.bmi)
class Goods:
discount = 0.5
def __init__(self, name, price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price * Goods.discount
apple = Goods('Apple', 5)
print(apple.price)