Day 8 面向对象

时间:2022-12-15 13:26:25

对象,是对事物的抽象,包含了事物的一些属性,和动作。

类示例

class Person(object):

    # 定义基本属性, 外部可访问
    name = ''
    # 定义保护属性,只有类本身和子类可以访问
    _sex = 'male'
    # 定义私有属性,只有类本身可以访问
    __weight = 0

    # __init__是一个特殊方法用于在创建对象时进行初始化操作
    # 通过这个方法我们可以为学生对象绑定name和age两个属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 方法之间要空出一行(编码规范)
    def speak(self, message):
        print("%s 说: %d。" % (self.name, message))

    # 方法名用全小写多个单词用下划线连接(编码规范)
    def watch_av(self):
        if self.age < 18:
            print('%s只能观看《熊出没》.' % self.name)
        else:
            print('%s正在观看动作片.' % self.name)


# 和上面代码有缩进差别,要空出两行(编码规范)
def main():
    # 创建Person对象并指定姓名和年龄
    p1 = Person('骆昊', 38)
    # 调用对象方法speak, 并传入参数
    p1.speak('我要学Python')
    # 调用对象方法 watch_av
    p1.watch_av()

 

继承

class Student(Person):
    grade = ''

    # 子类的构造函数
    def __init__(self, n, a, g):
        # 调用父类的构造函数
        Person.__init__(self, n, a)
        self.grade = g

    # 覆写父类的方法
    def speak(self, message):
        print("%s 说: %d ,我已经在读 %d 年级" % (self.name, message, self.grade))


def main2():
    # 创建学生对象并指定姓名和年龄
    stu1 = Student('王峰', 18)
    # 调用对象方法speak, 并传入参数, 因为复写了父类方法,所以以子类格式输出
    stu1.speak('我要学Python')

 

@property装饰器

@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便.

把一个getter方法变成属性,只需要加上@property。 此时,@property本身又创建了另一个装饰器@age.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

 

class Person(object):

    def __init__(self, name, age):
        self._name = name
        self._age = age

    # 访问器 - getter方法
    @property
    def name(self):
        return self._name

    # 访问器 - getter方法
    @property
    def age(self):
        return self._age

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

    def play(self):
        if self._age <= 16:
            print('%s正在玩飞行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)


def main():
    person = Person('王大锤', 12)
    person.play()
    person.age = 22

__slots__

class Cat(object):
    pass


def test():
    cat = Cat()
    cat.name = "小黑"
    print(cat.name)


# python 是动态语言,所以类Cat 没有任何属性, 当赋值后也会新创建一个属性
test()

为了限制类只能使用自己想要得几个属性,可以使用__slots__

class Cat(object):
    __slots__ = ('name', 'age')

类Cat 只能使用属性,name, age

静态函数

 使用 @staticmethod 标记方法,使用时不需要实例化。
class Triangle(object):

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

    # 静态方法
    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and c + a > b


if __name__ == '__main__':
    Triangle.is_valid((3,4,5))

 

类函数

使用 @classmethod标记方法
class Clock(object):
    """数字时钟"""

    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second

    @classmethod
    def now(cls): # cls 表示当前类
        ctime = localtime(time())
        return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec) # 相当于调用类的构造函数