python 100天练习 — Day9 面向对象编程进阶

本文介绍了Python面向对象编程的进阶概念,包括使用@property装饰器保护类属性,通过__slot__限制对象属性,静态方法和类方法的使用。此外,还讨论了继承、多态以及通过综合案例展示了这些概念的应用,如奥特曼打小怪兽、扑克牌游戏和工资系统的设计。
摘要由CSDN通过智能技术生成

本文以GitHub上100天python从新手到大师为素材,规划为约100天的练习,每次的学习和总结均发在这里。有错误的地方还请朋友们指正。

@property装饰器

在上一篇文章中我们有防止类中的属性被访问的方法,但仍然有暴露的可能,现在我们可以用装饰器@property来包装getter和setter方法来起到类属性的访问和修改功能,这样子对属性的访问既安全又方便,示例如下:

class person(object):
    def __init__(self, name, age):
        self._name = name
        self._age = age
        
	#访问器-getter方法
    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age
        
	#修改器-setter方法
    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        print(self._name, self._age)

dy = person('dy',24)
dy.play()
dy.age = 100
dy.play()
dy.name = 'yd'
#dy.name = 'yd'
#AttributeError: can't set attribute

根据示例代码我们可以看到,如果我们没有对属性进行setter方法的编辑,对属性修改就会报错。从而达到不能够修改的目的。

slot魔法方法

python是一门动态语言,也就是可以在程序运行的时候给对象绑定新的属性和方法,但如果我们需要限定对象只能绑定指定的属性,我们可以用__ slot __ 魔法方法绑定类内的属性,可以理解为这个类内只可以绑定slot指定的属性,而不能再添加其他的属性。slot只对当前类生效,对它的子类不生效。

下面是示例代码

class people(object):
    __slots__ = ('_name', '_age', '_gender')
    def __init__(self, name, age, gender):
        self._name = name
        self._age = age
        self._gender = gender

    @property
    def age(self):
        return self._age

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

    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        print(self._age, self._name)

dy = people('yd', 23, 'male')
dy.play()
dy.pee = 3
#AttributeError: 'people' object has no attribute 'pee'

从示例代码里我们可以看出,在使用slot绑定name、age、gender三个属性后,如果想再向“dy”这个实例中添加一个pee属性就会报错了。

静态方法和类方法

静态方法

我们之前学习的都是对象方法,就是说这些方法都是发送给对象的消息。而静态方法是一种不使用类属性的方法,静态方法可以理解成存在类内但是与类无关的方法,比如有一个三角形的类,需要输入三条边的边长从而计算三角形面积,但在此之前我们需要做的是判断输入的三条边能否构成三角形,这时候静态方法就起到了这个作用,静态方法使用@statemethod来定义,下面是示例代码:

from math import sqrt

class triangel(object):

    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c

    @staticmethod
    def is_vaild(a, b, c):
        return a+b>c and b+c>a and a+c>b

    def perimeter(self):
        return self._a + self._b + self._c

    def area(self):
        half = triangel.perimeter(self)/2
        return sqrt(half* (half - self._a)* (half- self._b)* (half - self._c))

if triangel.is_vaild(3, 4, 5):
    tri = triangel(3, 4, 5)
    zhouchang = tri.perimeter()
    mianji = tri.area()
    print(zhouchang, mianji)

从上面的代码看出我们在构建前可以先使用静态方法 is._vaild来判断,之后再计算周长和面积。

类方法

类方法是以类为对象操作的方法,使用装饰器@classmethod,约定的参数对象为cls,当逻辑上采用方法对类操作而不是对实例对象操作时采用,例如当我们建立一个班级类,它的子类是学生,并且我们想知道班里一共创建了多少学生,这时候显然不能在学生实例里操作,也不可能为了计算学生人数创建一个班级实例。(此处参考了蔷薇的文章
)下面是示例代码:

class ClassTest(object):
    __num = 0

    @classmethod
    def addNum(cls):
        cls.__num += 1

    @classmethod
    def getNum(cls):
        return cls.__num

    # 这里我用到魔术方法__new__,主要是为了在创建实例的时候调用累加方法。
    def __new__(self):
        ClassTe
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值