Python学习基础笔记五十九——封装和@property

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)
class Person:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name + sb

    @name.setter
    def name(self, new_name):
        self.__name = new_name


tiger = Person(taige)
print(tiger.name)
tiger.name = quanban
print(tiger.name)

属性:查看修改删除

class Person:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    # @name.setter
    # def name(self, new_name):
    #     self.__name = new_name

    @name.deleter
    def name(self):
        del self.__name


tiger = Person(taige)
print(tiger.name)
del tiger.name
print(tiger.name)
经验分享 程序员 微信小程序 职场和发展