浅谈零基础教程总结30天--day14

一、属性私有化

python中属性只有公开和私有

公开:是指在类的外面可以直接使用

私有:只能在类的内部使用

私有属性:属性下面必须有两个下划线组成,并且只能在类的内部使用

二、假的私有属性

在开发中很少使用真正的私有属性和公开属性

1.赋值的时候,需要对属性进行规范

满足以上要求使用假的私有属性,属性前面加一个下划线表示

2.通过属性添加getter和setter来限制获取值和赋值

getter的作用:返回属性值

@property

def 属性名(去掉下划线)(self):

​ 任何操作

​ return self._属性名

@属性名.setter

def name(self,参数)

​ 任何操作

self._属性名=(参数)

# 示例一:getter和setter的写法
class Person:

    def __init__(self, name='', age=0):
        # 声明属性的时候,在属性名前加_,是为了告诉别人,
        # 这个属性不要直接访问,要通过getter或者setter去访问
        self._name = name
        self._age = age

    # 给_name属性添加getter
    @property
    def name(self):
        if len(self._name) == 0:
            return '无名氏'
        return self._name

    # 给_name属性添加setter
    @name.setter
    def name(self, name1):
        # 可以在给属性赋值前做其他操作
        if isinstance(name1, str):
            self._name = name1
        else:
            self._name = ''

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


p1 = Person('小明')
# print(p1._name)  # 是不会报错的,但是不推荐使用
# p1._name = '路飞'

print(Person.name)
print(p1.name)
p1.name = '娜美'
print(p1.name)

三、类字段和类方法

类字段就是类属性:通过类去获取

类字段是声明在类里面,函数外面的变量

类方法:必须通过类去调用

怎么声明对象方法还是类方法,就看实现 这个功能是不是需要对象属性去支持,不需要就是累方法

@classmethod来说明下面的函数是一个类方法 --> 函数修饰符

所有的类方法都有一个默认参数cls,静态方法没有

调用需要类去调用

class Math:
    @classmethod
    def add(cls, *num):
        sum1 = 0
        for x in num:
            sum1 += x
        return sum1


sum1 = Math.add(10, 2, 3)
print(sum1)

二、静态方法

class Math:
    """数学类"""

    # multiply就是一个静态方法
    @staticmethod
    def multiply(num1, num2):
        return num1 * num2
# 静态方法需要使用类来调用
print(Math.multiply(10, 4))



# 示例二:静态方法和类方法的区别
"""
静态方法和类方法都是通过类去调用

区别:
1. 类方法都有一个默认参数cls指向调用方法的类,但是静态方法没有
2. 类型不一样,静态方法的类型是function,类方法的类型是method
"""

三、继承

继承:继承就是让子类去拥有父类的属性和方法
子类:继承者
父类(超类):被继承者

什么时候用继承:在写一个类的时候,发现这个类中的部分属性和方法另一个类都拥有,
这个时候就不用去声明这些属性和方法,直接从另外一个类中继承下来就可以
"""
总结:属性和方法除了私有的都可以继承; __slots__不能继承的

四、重写

声明一个类,如果不声明其父类,那么这个类默认继承自object这个类。
# object类是python中所有类直接或者间接的父类
# 示例一:什么是重写
"""
重新实现从父类继承下来的方法 ---> 重写
"""
class Aniaml(object):

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

    def shout(self):
        print('%s:嗷嗷叫' % (self.name))

    def be_beat(self):
        print(self.name,'在跑')
        print('跑的时候嗷嗷叫')

class Dog(Aniaml):

    # 重写父类的shout方法。然后通过Dog对象调用shout执行的是子类的方法
    def shout(self):
        print('%s:汪汪汪!'% (self.name))

    # 重写父类的be_beat,保留了父类实现的功能,并且添加了新的功能
    def be_beat(self):
        # super()指的就是父类对象
        super().be_beat()
        print('奋起反抗')

dog1 = Dog('大黄')
dog1.shout()
dog1.be_beat()

# 示例2:init方法的继承和重写
class Person:
    """人"""
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age
class Student(Person):
    """学生类"""
    """
    重写init方法要注意:
    1.如果需要继承父类的对象属性,就需要通过super().__init__()去保留父类的对象属性。然后再添加新的属性
    """
    def __init__(self, name='', age=0, study_id=''):
        super().__init__(name, age)
        self.study_id = study_id
stu1 = Student()
print(stu1.name)
print(stu1.study_id)

stu2 = Student('name1', 18, '001')
print(stu2.name)

stu3 = Student(study_id='002')

猜你喜欢

转载自blog.csdn.net/zhang_qings/article/details/81257134