从零开始学Python3之八——面向对象编程

self

    Python 中的  self  相当于 C++ 中的指针以及 Java 与 C# 中的  this  指针。
    

    我们通过使用  class  语句与这个类的名称来创建一个新类。在它之后是一个缩进的语句块,代表这个类的主体。通过采用类的名称后跟一对括号的方法,给这个类创建一个对象。
class Person:
    pass

p = Person()
print(p)

运行结果:

    结果说明在  Person  类的  __main__  模块中有一个实例。本例还会打印出计算机内存中存储你的对象的地址。

方法

    类与对象一如函数那般都可以带有方法(Method),唯一的不同在于还有一个  self  变量。
class Person:
    def say_hi(self):
        print("hi")

p = Person()
p.say_hi()

Person().say_hi()

    运行结果:
    
    注意到  say_hi  这一方法不需要参数,但是依旧在函数定义中拥有  self  变量。


__init__  方法

     __init__  方法会在类的对象被实例化(Instantiated)时立即运行。这一方法可以对任何你想进行操作的目标对象进行初始化(Initialization)操作。
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()
运行结果:
类似C++中的 构造函数


类变量与对象变量

    数据部分——也就是字段——只不过是绑定(Bound)到类与对象的命名空间(Namespace) 的普通变量。这就代表着这些名称仅在这些类与对象所存在的上下文中有效。这就是它们被称作“命名空间”的原因。
    字段(Filed)有两种类型——类变量与对象变量,它们根据究竟是类还是对象拥有这些变量来进行分类。
    类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。该类变量只有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有实例中都会得到体现。
    对象变量(Object variable)由类的每一个独立的对象或实例所拥有。
'''
类变量是共享的,可以被属于该类的所有实例访问
类变量只有一个副本,当任何一个对象对类变量作出改变时,
发生的改变将在其它所有实例中都得到体现
'''

class Robot:
    population = 0

    def __init__(self, name):
        self.name = name
        print("(Initializing {})".format(self.name))
        Robot.population += 1

    def die(self):
        print("{} is being destroyed".format(self.name))
        Robot.population -= 1
        if Robot.population == 0:
            print("{} was the last one".format(self.name))
        else:
            print("There are still {:d} robots working".format(self.population))

    def say_hi(self):
        print("Greetings, my masters call me {}".format(self.name))

    @classmethod
    def how_many(cls):
        print("We have {:d} robots.".format(cls.population))


droid1 = Robot("R2-D2")
droid1.say_hi()
Robot.how_many()

droid2 = Robot("C-3P0")
droid2.say_hi()
Robot.how_many()

droid1.die()
droid2.die()
Robot.how_many()

运行结果:

与C++/Java区别: 所有类成员(包括数据成员)都是公开的,并且 Python 中所有的方法都是虚拟的 (Vireual)。

继承

    
'''
基类的__init__方法是通过self变量被显式调用的,因此可以初始化对象的基类部分
由于在子类中定义__init__方法,Python不会自动调用基类的构造函数,必须显式调用
相反,如果没有在子类中定义__init__方法,Python将会自动调用基类的构造函数

【注意】
当使用SchoolMember类的tell方法时,可以将Teacher或Student的实例看作是SchoolMember的实例
'''

class SchoolMember:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("(Initialized SchoolMember : {})".format(self.name))

    def tell(self):
        print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=' ')


class Teacher(SchoolMember):
    def __init__(self, name, age, salary):
        SchoolMember.__init__(self, name, age)
        self.salary = salary
        print('(Initialized Teacher: {})'.format(self.name))

    def tell(self):
        SchoolMember.tell(self)
        print('Salary:"{:d}"'.format(self.salary))


class Student(SchoolMember):
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self, name, age)
        self.marks = marks
        print('(Initialized Student:{})'.format(self.name))

    def tell(self):
        SchoolMember.tell(self)
        print('Marks:"{:d}"'.format(self.marks))


t = Teacher("Mrs. S", 40, 30000)
s = Student("S", 25, 75)

# 打印一行空白行
print()

members = [t, s]
for member in members:
    member.tell()

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值