面向对象

class Person:
    is_good_person = True # 类属性(优先找实例变量),虽然跟默认参数(__init__(self, name, sex, is_good_person = True))效果一样,但是更省内存
    def __init__(self, name, sex):
        self.name = name # 实例属性(静态属性),作用域是实例本身
        self.sex = sex
    def speak(self): # 类方法(动态属性)
        print(666)

 

__init__  构造函数:在实例化的时候做一些类初始化的工作

__del__ 析构函数:在实例释放、销毁的时候(删除实例或者程序退出)自动执行的,通常用于做一些收尾工作,如关闭一些数据库连接,关闭打开的临时文件

 

vivi = Person('weiwei', 'girl')

print(vivi.is_good_person)

vivi.best_friend = 'Allen'

# 虽然类本身没有这个属性,但这句话就相当于 self.best_friend = 'Allen',原因:
# vivi = Person('weiwei', 'girl')  相当于 Person(vivi, 'weiwei', 'girl')
# 所以类里面的 self.name = name 相当于 vivi.name = name
# 同理 vivi.best_friend = 'Allen' 是有效的

del vivi.best_friend # 删除实例变量

 私有属性,私有方法:只有内部才能访问的属性,方法,在属性名或方法名前面加两个下划线__

 

类的继承

class Hero(Person): # 继承Person类
    def speak(self): # 重构父类的speak方法
        Person.speak(self)
        print("{} is hero!".format(self.name))

me = Hero('Allen', 25)
me.speak()

# 输出
# 666
# Allen is hero!

 经典类与新式类

class Person: # 经典类
class Person(object): # 新式类

Person.__init__(name, age) # 经典类调用父类方法
super(Hero, self).__init__(name, age) #新式类调用父类方法

 多继承的顺序是从左至右继承,实例化时会找到第一个构造函数执行,而不会执行每一个构造函数。

规则:

  Python2 经典类是按深度优先来继承,新式类是由广度优先来继承;

  Python3 经典类和新式类都是按照广度优先来继承。

多态

  一个接口,多种实现(作用:接口重用)。

class Person(object):
    @staticmethod
    def person_speak(obj):
        obj.speak()

class Hero(Person):
    def speak(self):
        print("I'm hero")

class Badperson(Person):
    def speak(self):
        print("I'm bad person")

h = Hero()

b = Badperson()

Person.person_speak(h)
Person.person_speak(b) # 一个接口,多种实现

# 输出
# I'm hero
# I'm bad person

 

posted @ 2018-07-15 11:04  AllenZhang_(*^▽^*)  阅读(121)  评论(0编辑  收藏  举报