Python(5):类(魔术方法+反射方法+静态属性+封装/继承/多态)

一、认识类

举一个简单的例子:把人看成一个类,人有很多共同的属性(年龄,姓名,身高等待),人有很多共同的方法(去吃饭,去睡觉,去看蔡徐坤跳舞等等)。而李明就是人的一个对象,他有人(类)的属性和方法。

1.定义一个简单的类及其使用

在Python中,类通过 class 关键字定义,类名通用习惯为首字母大写,Python3中类基本都会继承于object类,语法格式如下,我们创建一个People类:

# -----------------------方式1
# # 创建People类,People为类名,继承object类也可以不继承object类;两者区别不大,但没有继承于object类使用多继承时可能会出现问题。
class People(object):  
    pass

# -----------------------方式2
# 默认继承object类
class People:
    pass

有了People类的定义,就可以创建出具体的实例.如下我们创建两个People类的实例,并且使用类中的方法和公共属性

class People:
    def __init__(self):
        self.China = "中国"

    def chifan(self):
        print('我要吃饭')

    def wc(self):
        print('我要上厕所')


if __name__ == '__main__':
    p1 = People()
    p2 = People()

    p1.chifan()  # 我要吃饭
    p1.wc()  # 我要上厕所

    print(p2.China)  # 中国
    p2.chifan()  # 我要吃饭

我们看到刚刚上述,每个方法里有一个self(名字可改,默认self),该值是类中的方法需要的,哪个对象调用方法或者属性,self就是那个值,如果在类中的某个方法调用类中的另一个方法或属性,可以直接使用

class People:
    def __init__(self):
        self.China = "中国"

    def chifan(self):
        print('我要吃饭')

    def wc(self):
        print('我要上厕所')

    def aaa(self):
        print(self.China)
        self.chifan()
        self.wc()


if __name__ == '__main__':
    p = People()
    p.aaa()

在这里插入图片描述

2.类属性和实例属性

class People:
    father = '张三'

    def fun(self, mother):
        return '爸爸是{},妈妈是{}'.format(self.father, mother)

if __name__ == '__main__':
    people = People()
    print(people.fun('丽丽'))
    print(id(people.father))  # 类属性可以通过对象名.变量名
    print(id(People.father))  # 也可以用类名.变量名

    people.father = '李四'  # 实例属性只修改自己的值,与原来的值无关,类似一个局部变量
    People.father = '王五'  # 会修改整个类的值,但是有的对象通过对象名.变量修改过值的,无法再修改,因为此时地址已经不同
    print(people.father)
    print(People.father)

在这里插入图片描述

二、面向对象的三大特征

1.封装

  • 定义: 封装是将类中的某些方法或者属性隐藏,对象不能直接使用隐藏的方法或者属性,具有保护功能
  • 格式: __属性(方法),使用双下划线
  • 目的: 保护隐私
  • 调用: 只有在本类的内部可以使用,外部不可以修改和使用

举例:

class Girl:
    name = '张三'
    __age = 15

    def show(self):
        print(self.name, self.__age)


if __name__ == '__main__':
    g = Girl()
    g.show()

当我们在类中调用时候,是正常的
在这里插入图片描述
如果实例直接调用呢?因为是私有属性,外部不可直接使用,会报错

print(g.age)
# 或者
print(g.__age)

在这里插入图片描述
那么我们直接修改这个__age呢?

g = Girl()
g.__age = '20'
print(g.__age)
  • 这样使用并不是修改类中的__age,而是重新创建了一个__age的属性

  • 另外我们可以使用实例对象.__dict__方法查看所有a属性的元素

    print(g.__dict__)#---{'name': '张三', '_Girl__age': 10, '__age': 15}
    
  • 但是如果非想改,可以使用实例对象._类名__属性名修改,但是不建议使用

    g = Girl()
    g._Girl__age = 30
    g.show()
    

    在这里插入图片描述

2.继承

  • 定义: 子类需要使用父类的属性和方法,但是子类中也可以定义自己的属性和方法。
  • 概念: 被继承的类叫父类/基类/超类,继承的类叫子类/派生类
  • 注意事项
    1. 子类继承父类,如果子类不重写父类的某个方法,那么子类执行父类的方法
    2. 子类继承父类,如果子类复写了某个方法,那么子类只使用自己的方法
    3. 父类的私有属性不能被继承

① 单继承

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('吃')

    def sleep(self):
        print('睡')

class Cat(Animal):#-------------------继承谁就在括号里写谁
    def jiao(self):
        print('喵'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张烫麻辣亮。

谢谢老板,祝你生8个儿子!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值