Python学习笔记——面向对象(类与对象)

1、类

class Person:  # 创建一个新类
    pass  # 这个类的主体是 一个空的代码块


p = Person()  # 采用类名()的方式给这个类创建一个对象
print(p)  # 打印结果告诉我们 在Person类的 __main__模块中拥有了一个实例;
# 此外还会打印出计算机内存中存储这个对象的地址

2、__init__方法

class Person:
    def __init__(self, name):  # name为一个局部变量
        self.name=name

    def sayhi(self):
        print('hi,how are u', self.name)


p = Person('guana')
p.sayhi()

3、类变量 & 对象变量

类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。 该类变量只拥有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有 实例中都会得到体现。

对象变量(Object variable)由类的每一个独立的对象或实例所拥有。在这种情况下,每个 对象都拥有属于它自己的字段的副本,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的字段产生关联。

'''
1、声明一个类:机器人
2、声明一个类变量,计数机器人的数量
3、定义 init函数,并告知用户已初始化机器人的名称,并注意计数变量的变化
4、定义die函数,注意计数变量的变化
5、sayhi函数
6、计数函数
'''


class Robot:
    population = 0

    def __init__(self, name):
        self.name = name
        print('Initialized ', 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 {} robots'.format(Robot.population))  # 这里用{:d}

    def say_hi(self):
        print('hi,i am {}'.format(self.name))
# classmethod 类方法,@classmethod为装饰器,可将how_many方法标记为类方法
    @classmethod  
    def how_many(cls):
        print('we have {:d} robots'.format(cls.population))


r1 = Robot('ET')
r1.say_hi()
Robot.how_many()

r2 = Robot('moka')
r2.say_hi()
r1.die()
Robot.how_many()

r2.die()
Robot.how_many()

'''
打印结果:

Initialized  ET
hi,i am ET
we have 1 robots
Initialized  moka
hi,i am moka
----------ET is being destroyed----------
there are still 1 robots
we have 1 robots
----------moka is being destroyed----------
moka was the last one
we have 0 robots
'''

 

4、超类 & 子类

继承关系

'''
1、定义超类,定义初始化函数,tell函数
2、定义子类Teacher,定义子类的初始化函数、子类的tell函数
3、定义子类Student,... ...
4、建立对象
5、调用所有tell
'''


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=' ')  # end=' '使得此print在打印的末尾不换行,从而使salary、marks等能够和name、age输出在同一行


class Teacher(SchoolMember):  # 在定义子类时,需要在子类类名后跟一个包含超类名称的元组
    def __init__(self, name, age, salary):
        # 因为我们在Teacher和Student子类中定义了__init__方法,Python不会自动调用基类SchoolMember的构造函数,你必须自己显式地调用它。
        SchoolMember.__init__(self, name, age)  # 调用超类的方法时,这里要传入self和其余变量
        self.salary = salary
        print('Initialized Teacher: {}'.format(self.name))

    def tell(self):  # 同上,调用超类的方法时,这里要传入self和其余变量
        SchoolMember.tell(self)
        print('salary: {}'.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: {}'.format(self.marks))


t = Teacher('yang', 30, 9000)
s = Student('zhang', 20, 99)
member = [t, s]  # 这里的列表中项目类型为对象,而非字符串,所以不能't','s'
for m in member: # for...in 能在任何队列中工作。总体来说可以包含任何类型对象的队列!
    m.tell()
print('Done')

'''
打印结果:

Initialized SchoolMember: yang
Initialized Teacher: yang
Initialized SchoolMember: zhang
Initialized Student: zhang
name: yang, age: 30, salary: 9000
name: zhang, age: 20, marks: 99
Done

'''

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值