继承与多态

一:Python下载地址

Python官网:http://www.python.org/
Python文档下载地址:http;//www.python.org/doc/
通过ubuntu官方apt工具包安装:
$sudo apt-get install python
$sudo apt-get install python2.7
$sudo apt-get install python3.7

运行Python代码

用pip来安装缺少的request模块:如:pip install request
安装好Pycharm!!!
!!!!!
!!!!!
!!!!!

万物皆对象

  1. 类定义class,关键字self
  2. 类的初始化函数:init

学生的例子:

  1. 类的定义和使用:
# 面向过程
'''
首先定义两个学生
'''
stu1 = { 'name': 'xiaohong', 'score': 98 }
stu2 = { 'name': 'xiaobai', 'score': 81 }

# 函数
def print_score(stu):  # 定义一个函数
    print('%s: %s' % (stu['name'], stu['score']))

# 面向对象
# 1.设计类
#  属性和方法

class Student(object):  # class后接类名称
    # 方法  self指向创建的实例本身
    def __init__(self,name,score):  # 括号内含有要传入的参数,为形参
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name,self.score))

# 实例化对象1
xiaohong = Student('xiaohong',98)
# print(id(xiaohong))  # 打印其id地址 每初始化一个对象 内存地址都不一样
# 实例化对象2
xiaobai = Student('xiaobai',81)
# print(id(xiaobai))
# 实例化对象3
xiaobai = Student('xiaobai',81)
# print(id(xiaobai))

# xiaobai.print_score()  # 打印小白的分数
#xiaohong.print_score()

# print(xiaobai.name,xiaobai.score)  # 第二种方法来打印小白的分数
# print(xiaohong.name,xiaohong.score)

'''
    继承,封装,多态
'''


class Student(object):
    # 方法  self指向创建的实例本身
    def __init__(self,name,score):
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name,self.score))

    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

xiaolv = Student('xiaolv',45)
#print(xiaolv.get_grade())

xiaolv.score=90
# print(xiaolv.get_grade())
'''
    访问限制  私有属性
'''

class Student(object):
    # 方法  self指向创建的实例本身
    def __init__(self,name,score):
        self.__name = name
        self.__score = score  # 两个下划线代表为私有 内部可修改 外部不可以

    def print_score(self):
        print('%s: %s' % (self.__name,self.__score))

    def get_grade(self):
        if self.__score >= 90:
            return 'A'
        elif self.__score >= 60:
            return 'B'
        else:
            return 'C'

# 定义两种方法,来获取私有属性的值和修改私有属性
    def set_score(self,score):
        if  0<=score<=100:
            self.__score=score
        else:
            raise ValueError('分数请大于0小于等于100')

    def get_score(self):
        return self.__score

xiaolv = Student('xiaolv',45)

print(xiaolv.set_score(98))
print(xiaolv.get_score())
print(xiaolv.get_grade())
# python没有真正的是私有,把私有改名称_Student__name
# print(xiaolv._Student__name)

'''
    类属性
'''

# 实例属性  必须通过初始化或者实例化对象,通过对象去访问,
class Student(object):
    def __init__(self, name):
        self.name = name
s = Student('Bob')
print(s.name )

# 类属性  不需要实例化对象,直接通过类名访问
class Student(object):
    name = 'Student' # 全局变量

print(Student.name)



  1. 继承
# 子类和父类,子类可以得到父类的所有属性
class Animal(object):
    def run(self):
        print('Animal is running')

class Dog(Animal):
    pass

class Cat(Animal):
    pass

dog = Dog()
# dog.run()

cat = Cat()
# cat.run()

class Dog(Animal):
    def run(self): # 重写
        # 调用父类的run方法
        # super().run()
        print('Dog is running')

    def eat(self):
        print('eat meat')


dog = Dog()
dog.run()


class Cat(Animal):
    def run(self): # 重写
        # 调用父类的run方法
        # super().run()
        print('Cat is running')

    def eat(self):
        print('eat fish')


'''
    多态
'''

b=Animal() # b是Animal类型
c=Dog() # c是Dog类型


print(isinstance(b,Animal))  # 判断对象是何类
print(isinstance(c,Dog))
print(isinstance(c,Animal))
print(isinstance(b,Dog))

# 调用run_twice方法,需要传递Animal类的对象或者Animal的子类
def run_twice(animal):
    animal.run()
    animal.run()


run_twice(Dog())
run_twice(Cat())

run_twice(Animal())
# 好处就是两者不会冲突,更新不会修改太多,解耦,利于合作
# 代码运行时才确定对象的具体类型
'''
    类型判断
'''

import types
def fn():
    pass

print(type(fn)==types.FunctionType) # 判断类型
print(type(abs)==types.BuiltinFunctionType) # 判断是否时内置函数


# getattr(),setattr(),hasattr()

class MyObject(object):
    def __init__(self):
        self.x = 9

    def power(self):
        return self.x * self.x

obj = MyObject()

# obj 有属性'x'吗?
print(hasattr(obj,'x'))
print(obj.x)  # 调用x的值

# 设置一个属性'y'
setattr(obj,'y',19)
print(hasattr(obj,'y'))
print(getattr(obj,'y'))  # 动态取值 在常规中不介意使用


# dir() 获得一个对象所有属性和方法
print(obj.__dir__())
print(dir(obj))

a = [1,2]
print(len(a))
print(a.__len__())





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值