Python学习笔记(九)—— 面向对象编程

对象是面向对象编程的两个主要方面。
(Class)能够创建一种新的类型(Type),其中对象(Object)就是类的实例(Instance)。
对象可以使用属于它的普通变量来存储数据。这种从属于对象或类的变量叫作字段(Field)。对象还可以使用属于类的函数来实现某些功能,这种函数叫作类的方法(Method)。字段与方法通称类的属性(Attribute)。
通过 class 关键字可以创建一个类。这个类的字段与方法可以在缩进代码块中予以列出。

字段有两种类型——实例变量(Instance Variables)与类变量(Class Variables)。
类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。一个类的所有对象共享同一个类变量。
对象变量(Object variable)由类的每一个独立的对象或实例所拥有。在这种情况下,每个对象都拥有属于它自己的字段的副本。

类方法与普通函数的区别在于,类方法的参数列表的开头多出一个参数,这个参数必须位于参数列表的开始,一般命名为self,调用类方法时无需对该参数赋值,这个参数引用的是该对象本身。

class Person:
def say_hi(self):
print('Hello, how are you?')
p = Person()
p.say_hi()
# 前面两行同样可以写作
# Person().say_hi()

__init__方法

init 方法会在类的对象被实例化时立即运行,对对象进行初始化。作用相当于C++中的构造函数。
示例

class Person:
def __init__(self, name):
self.name = name
def say_hi(self):
print('Hello, my name is', self.name)
p = Person('Swaroop')
p.say_hi()
# 前面两行同时也能写作
# Person('Swaroop').say_hi()

@classmethod
使用@classmethod修饰的类方法,需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

应用示例:

class Robot:
    '''这是一个机器人'''
    population = 0

    def __init__(self,name):
        '''初始化数据'''
        self.name = name
        print('名字是{0}的机器人诞生了'.format(self.name))
        Robot.population +=1

    def die(self):
        '''我挂了'''
        print('{}挂了'.format(self.name))
        Robot.population -=1
        if Robot.population == 0 :
            print('所有的机器人都已经挂了')
        else:
            print('剩余{}个机器人存活'.format(Robot.population))

    def say_hi(self):
        """问候"""
        print('你好,我是{}'.format(self.name))
    @classmethod
    def how_many(cls):
        "打印当前机器人数量"
        print('当前存活机器人{}个'.format(Robot.population))
droid1 = Robot("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2 = Robot("C-3PO")
droid2.say_hi()
Robot.how_many()
print("\nRobots can do some work here.\n")
print("Robots have finished their work. So let's destroy them.")
droid1.die()
droid2.die()
Robot.how_many()

运行结果

名字是R2-D2的机器人诞生了
你好,我是R2-D2
当前存活机器人1个
名字是C-3PO的机器人诞生了
你好,我是C-3PO
当前存活机器人2个

Robots can do some work here.

Robots have finished their work. So let's destroy them.
R2-D2挂了
剩余1个机器人存活
C-3PO挂了
所有的机器人都已经挂了
当前存活机器人0个

注意:所有的类成员都是公开的。但有一个例外:如果你使用数据成员并在其名字中使用双下划线作为前缀,形成诸如 __privatevar 这样的形式,Python 会使用名称调整(Namemangling)来使其有效地成为一个私有变量。

继承
继承格式

class Derived(Base):
    pass

子类中如果没有__init__方法,则会直接调用父类的__init__方法,如果子类中定义了__init__方法,则不再自动调用父类的__init__方法,需要在子类的__init__方法中显示调用。

可以通过父类名前缀和传入self参数的方法调用父类的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值