python笔记(封装(含类方法和静态方法))

本文深入探讨Python中的封装概念,包括如何通过私有属性和方法保护类的内部状态,以及如何使用@property装饰器来优雅地管理类的属性。通过实例展示了如何控制属性的读取和修改,以及如何应用类方法和静态方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、封装:
1、广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装
2、只让自己的对象能调用自己类的方法
3、狭义上的封装 – 面向对象三大特性
4、属性和方法都藏起来,不让你看见

class Person:
    def __init__(self,name,passwd):
        self.name = name
        self.__passwd = passwd   #加上双下划线后会变成私有属性,只在类的内部可以使用
    def __get_pwd(self):         #加上双下划线后会变成私有方法
        return self.__passwd     #只要在类的内部使用私有属性,就会自动带上类名
long = Person('longlong','1234')  #long.passwd,long.__passwd都调不到
print(long.__dict__)
print(long._Person__passwd)     #_long.Person__passwd可以调到,但是是你在投机取巧的方式下知道的方式
print(long.get_pwd())

输出结果:

{‘name’: ‘longlong’, ‘_Person__passwd’: ‘1234’}
1234
1234

  1. 所有的私有 都是在变量的左边加上双下划线

    对象的私有属性
    类的私有方法
    类中的静态私有属性
    所有的私有的都不能在类的外部使用

    class Room:
        def __init__(self,name,length,wideth):
            self.name = name
            self.__length = length
            self.__wideth = wideth
        def set_name(self,newName):
            if type(newName) is str and newName.isdigit() == False:
                self.__name = newName
        def get_name(self):
            return self.__name
        def area(self):
            return self.__length*self.__wideth
    long = Room('龙龙',10,10)
    print(long.area())
    long.set_name('2')
    print(long.get_name())
    

    输出结果:

    100
    Traceback (most recent call last):
    File “D:/Python/python_txt/GUI进度条/GUI.py”, line 1258, in
    print(long.get_name())
    File “D:/Python/python_txt/GUI进度条/GUI.py”, line 1252, in get_name
    return self.__name
    AttributeError: ‘Room’ object has no attribute ‘_Room__name’

  2. 假设父类的私有属性能被子类调用会用到私有的这个概念的场景

    (1).隐藏起一个属性,不想让类的外部调用
    (2).我想保护这个属性,不能让属性随意被改变
    (3).我想保护这个属性不被子类继承

    @property:把类的方法伪装成一种属性

    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        @property
        def perimeter(self):
            return 2*pi*self.r
        @property
        def area(self):
            return pi*self.r**2
    
    c1 = Circle(5)
    print(c1.area)
    print(c1.perimeter)
    

    输出结果:

    78.53981633974483
    31.41592653589793

    class Person:
        def __init__(self,name,high,weight):
            self.name = name
            self.high = high
            self.weight = weight
        @property
        def bmi(self):
            return self.weight/self.high**2
    long = Person('龙',1.83,75)
    print(long.bmi)
    

    输出结果:

    22.395413419331717

     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
    
    geng= Person('耿')
    print(geng.name)
    geng.name = '娃'
    print(geng.name)
    

    耿sb
    娃sb

    class Goods:
    discount = 0.8
    def __init__(self,name,price):
        self.name = name
        self.__price = price
    @property
    def price(self):
        return self.__price*Goods.discount
    apple = Goods('苹果',5)
    print(apple.price)
    

    4.0

    @属性的查看 修改 删除

    class Person:
        def __init__(self,name):
            self.__name = name
        @property
        def name(self):
            return self.__name
        @name.deleter
        def name(self):           #删除
            del self.__name
        @name.deleter
        def name(self,new_name):  #修改
            self.__name = new_name
    geng = Person('耿娃')
    print(geng.name)
    del geng.name
    geng.name('娃')
    print(geng.name)
    

    输出结果:

    耿娃
    Traceback (most recent call last):
    File “D:/Python/python_txt/GUI进度条/GUI.py”, line 1333, in
    print(geng.name)
    File “D:/Python/python_txt/GUI进度条/GUI.py”, line 1326, in name
    return self.__name
    AttributeError: ‘Person’ object has no attribute ‘_Person__name’

  3. classmethod #类方法

    @当这个方法的燥作只涉及静态属性的时候,就应该使用class_method来装饰这个方法

    class Goods:
        __discount = 0.8
        def __init__(self,name,price):
            self.name = name
            self.__price = price
        @property
        def price(self):
            return self.__price*Goods.__discount
        @classmethod
        def change_discount(cls,new_discount): #cls代表这个类
            cls.__discount = new_discount
    apple = Goods('苹果',5)
    print(apple.price)
    Goods.change_discount(0.5)
    print(apple.price)
    

    输出结果:

    4.0
    2.5

  4. staticmethod #静态方法

    在完全面向对象的程序中,如果一个的数既和对象没有关系也和类没有关系那么就用staticmethod将这个函数变成一个静态方法

    class Login:
        def __init__(self,name,password):
            self.name = name
            self.pwd  = password
        def login(self):
            pass
        @staticmethod
        def get_usr_pwd():                 #没有默认参数,就像函数一样
            usr = input('用户名:')
            pwd = input('密码:')
            Login(usr,pwd)
    Login.get_usr_pwd()
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值