Python学习三(面向对象、类、__init__方法、继承)

Python学习

一、面向对象

1. 类

1.1 概述

用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

1.2 语法格式

类名使用驼峰命名。

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

示例:

class Person(object):
    name = "zhangsan"
    age = 20
	
    def study(self):
        print("I am studying...")
    def getInfor(self):
        print("%s 今年, %d 岁。" %(self.name,self.age))

# 实例化类
zs = Person()
zs.age = 30
print(zs.name)
print(zs.age)
zs.study()
zs.getInfor()

'''运行结果:
zhangsan
30
I am studying...
zhangsan今年,30岁。
'''

-注意:
python中,类的方法与普通的函数只有一个特别的区别:它们必须有一个额外的第一个参数名称,按照惯例它的名称是 self。self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类,self 不是 python 关键字。

1.3 __init__方法

类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用:

def __init__(self):
    self.data = []

类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法,对应的 __init__() 方法就会被调用:
__init__() 方法可以有参数,参数通过__init__() 传递到类的实例化操作上。

class Person(object):
	# 定义基本属性
    name = ""
    age = 0
    # 定义构造方法
    def __init__(self,n,a):
        self.name = n
        self.age = a
    def study(self):
        print("I am studying...")
    def getInfor(self):
        print("%s 今年, %d 岁。" %(self.name,self.age))

# 实例化类
zs = Person("zhangsan",10)
print(zs.name)
print(zs.age)
zs.study()
zs.getInfor()
1.4 继承

Python支持多继承形式。

语法格式:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

示例:

# 父类
class A:
    def testA(self):
        print("这是父类A的test方法")
class B:
    def testB(self):
        print("这是父类B的test方法")
        
# 子类    
class C(A,B):
    def myTest(self):
        print("这是子类自己的方法")

c = C()
c.testA()
c.testB()
c.myTest()

# 运行结果
这是父类A的test方法
这是父类B的test方法
这是子类自己的方法
  • 注意:
    当多重继承中父类中存在同名的方法,那么此时,子类在调用时会调用哪个方法呢?
    在python中,为了避免这种情况,使用MRO的方式进行方法的查找,即按照继承的顺序依次查找。如果子类中重写了该方法,就调用子类本身的,如果没有,就先查找A,找到了就调用,找不到就继续往下找,查找B,以此类推。如果最终都没有找到匹配的,就会报错。菱形继承是多重继承的典型问题,有兴趣可以去了解。在java中,可以通过接口或者内部类来实现这种类似多重继承的作用。

super()函数

class A:
    def test(self):
        print("这是A的test方法")
        
class B(A):
    def test(self):
        super().test()
        print("这是B的test方法")
        
class C(B):
    def myTest(self):
        print("这是C的方法")

c = C()
c.test()
# 运行结果:
这是A的test方法
这是B的test方法

子类C如果重写了B中的test方法,就会首先调用子类自己的方法,如果没有,就调用父类B的方法,要想进一步调用A的test方法,只需要在A的子类B中使用super关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值