每天5个python小技巧(day6)

本文深入探讨Python中的面向对象特性,包括类方法(@classmethod)、静态方法(@staticmethod)、实例方法的使用,以及@property装饰器实现属性访问控制和私有成员的实现。类方法允许修改类属性,影响所有实例,静态方法不依赖实例或类,而实例方法用于操作实例属性。@property用于创建getter和setter,确保属性访问的安全性。

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

面向对象篇

​ “如果你读自己6个月前写的代码并且感觉仍然很好,那么可能就有些不对劲了。这通常意味着你这6个月没有学到新东西。” ----Brett Cannon


​ “一切皆对象”是Python编程的核心思想之一。面向对象编程是Python的一大特色,今天将深入探索Python中的 类方法静态方法和普通的 实例方法

1.@classmethod – 类方法

(1) 在类的方法中使用@classmethod标记方法为类方法。类方法并不接受self参数,而是接受cls参数,使用cls指向类本身,而不是对象实例。 因此类方法不能改变对象实例的状态

class User:

    authority = ['visitor']  # 类的属性

    def __init__(self, name, passwd):
        self.name = name  # self.name: 实例的属性
        self.passwd = passwd

    @property
    def password(self):
        print("This's a private attribuition")
        return None

    @classmethod
    def authorityUper(cls):
        User.authority.append('admin')


if __name__ == '__main__':
    user1 = User('Tom', '123')
    user2 = User('Jenny', '1234')
    print(user1.authority)
    user2.authorityUper()
    print(user1.authority)
['visitor']
['visitor', 'admin']

​ 类方法在实例中调用,可以修改类的属性,从而修改所有实例的属性。

(2)调用类方法还可以返回该类的实例,可快速获得不同的默认方案实例。

​ 比如下面的设置餐厅的默认菜单…

class Menu:

    def __init__(self, default):
        self.default = default

    @classmethod
    def IndianDeault(cls):
        return cls(['Pork'])

    @classmethod
    def JewishDeault(cls):
        return cls(['Beef'])

    def __repr__(self):
        return f"Menu({self.default})"


if __name__ == '__main__':
    IndiaRestaurant = Menu.IndianDeault()
    JewishRestaurant = Menu.JewishDeault()
    print(IndiaRestaurant)
    print(JewishRestaurant)

Menu(['Pork'])
Menu(['Beef'])
2.@staticmethod – 静态方法

​ 静态方法不能访问clsself,其作用和普通函数相同,但属于类的命名空间 。在类中使用@staticmethod标记类的静态方法。

3.实例方法

​ 在类中比较常见的是实例方法,实例方法的self参数指向实例本身,通过self可修改或访问实例的属性。

4.@property – 内置描述符

property()函数提供一个内置的描述符类型,它知道如何将一个属性链接到一组方法上。它接受4个可选参数:fgetfsetfdeldoc,通常用@property装饰器标识类的方法实现。

class Retangle:

    def __init__(self, x1, x2, y1, y2):
        self.x1, self.x2 = x1, x2
        self.y1, self.y2 = y1, y2

    @property
    def width(self):
        """Retange's width measured from x1 to x2"""
        return abs(self.x1 - self.x2)

    @width.setter
    def width(self, value):
        """Set Retangle's width"""
        self.x2 = self.x1 + value
        print("Successfully set!")


if __name__ == '__main__':
    retangle = Retangle(1, 2, 3, 4)
    wid = retangle.width
    print(wid)
    retangle.width = 3
    print(retangle.width)
    print(retangle.x2)
1
Successfully set!
3
4
5.私有成员的实现

python面向对象成员的权限属性由变量的命名决定。

(1)变量名加单下划线_前缀,这是python命名规范约定的规则,Pycharm中会有弱警告,仍然能通过.操作符访问该变量,建议不要访问该命名方式的变量。

(2)变量名前加双下划线__前缀,访问该变量时会出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值