数据分析_Python学习04(面向对象)

面向对象的类和对象
类;一类事物,知识一个概念 Dog
对象:具体到某一个东西     zf家的狗
对象可以有属性和方法

一个简单的创建类的例子

一个简单的例子:
# 类的定义
class Teacher(object):
    country = 'China'

    def teach(self):
        print('老师可以教书')

# 创建对象
teacher = Teacher()
print(teacher.country)
print(teacher.teach())

# 查看类继承的父类
print(Teacher.__bases__)        # (<class 'object'>,)

# 在方法外对属性进行添加、获取和修改
# 添加
teacher.name = 'zf'
teacher.age = 30

# 获取
print(teacher.name, teacher.age)        # zf 30

# 修改
teacher.name = 'zf2'
print(teacher.name, teacher.age)        # zf2 30

__innit()方法

# __innit()方法
class Student(object):

    # 对象创建时候的初始化方法
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # study方法
    def study(self):
        print('学生{0}的主要任务就是学习'.format(self.name))

# 创建对象
stu1 = Student('zf', 30)
stu1.study()

stu2 = Student('ff', 29)
stu2.study()

继承

# 继承
# 单继承
# 父类
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def sleep(self):
        print('需要睡觉')

# 子类
class Doctor(Person):
    pass

# 创建医生doctor对象
doctor = Doctor('zf', 30)
# 子类可以直接使用父类的属性和方法
print(doctor.name, doctor.age)
doctor.sleep()


# 多继承
class A(object):
    def show(self):
        print('A类')

class B(object):
    def show(self):
        print('B类')

class C(A, B):
    pass

c = C()
c.show()        # A类
"""
C既继承A类,又继承B类,在调用方法show()的时候遵循的是mor规则,以决定继承的顺序(方法调用查找的顺序)
"""
# 查看继承顺序
print(C.mro())  # [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

重写

# 重写
# 重写的特点:1.继承 2.方法名相同
class Phone(object):
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def show(self):
        print(self.name, self.price)

class Iphone(Phone):
    def __init__(self, name, price, color):
        self.name = name
        self.price = price
        self.color = color

    def show(self):
        print(self.name, self.price, self.color)

phone1 = Iphone('XR', '5299', 'white')
phone1 .show()       # XR 5299 white (调用的是重写的方法)

私有方法、私有属性

# 私有方法、私有属性
class Gun(object):
    def __init__(self, name, color):
        # 公有属性
        self.name = name
        self.color = color

        # 私有属性(__开头的属性)
        self.__bulet = 5.56

    def show(self):
        print(self.name, self.color, self.__bulet)

gun1 = Gun('M416', 'black')
# gun1.__bulet   报错 在方法外调用不了私有属性
gun1.show()     # M416 black 5.56   但是可以调用使用了私有属性的方法show()


# 私有方法的应用
class Person(object):
    def __init__(self, name):
    	# 实例属性
        self.name = name
        # 私有属性
        self.__age = 0

    # 设置年龄
    def set_age(self, new_age):
        if new_age > 0 and new_age < 100:
            self.__age = new_age
        else:
            self.__age = 30

    # 获取年龄
    def get_age(self):
        return self.__age

person1 = Person('zf')
person1.set_age(-20)
print(person1.get_age())		# 30

类和实例属性、实例方法的关系

类和实例属性、实例方法的关系
class Person(object):
    def __init__(self, name):
        # 实例属性
        self.name = name

    # 实例方法,需要用实例对象来调用
    def show(self):
        print('名字叫{}'.format(self.name))

p1 = Person('ff')
p2 = Person('zf')

# 调用实例属性和方法
print(p1.name)      # ff
print(p1.show())    # 名字叫ff

# 类不能调用实例属性
# print(Person.name)  报错

# 类不能直接调用实例方法
# Person.show()       # 错误,缺少位置参数“self”
Person.show(p1)     # 名字叫ff
Person.show(p2)     # 名字叫zf

补充一个例子:

# 类属性:定义在方法外类里面的属性
# 实例属性:定义在方法内的属性
class Phone(object):
    # 类属性
    OS = 'IOS'
    def __init__(self, name, color):
        # 实例属性
        self.name = name
        self.color = color

    def show(self):
        print(self.name, self.color)

# 调用类属性
# 1. 使用类直接调用
print(Phone.OS)     # IOS

# 2. 使用对象调用
phone1 = Phone('IPhone XR', 'white')
print(phone1.OS)     # IOS

# 修改类属性
# 1. 使用类修改
Phone.OS = '安卓'
print(Phone.OS)     # 安卓

# 2. 使用对象修改
phone1.OS = '塞班'  # 修改失败
print(Phone.OS)     # 安卓
print(phone1.OS)    # 塞班 此时相当于对象phone1创建了一个属性OS,并赋值为塞班,和类属性OS同名而已。

# 总结:类属性的操作是由类完成(多个对象之间是可以共享的),对象属性(实例属性,init中)要用对象来操作。

再补充一个:
类属性的一个小的应用案例:

# 类属性的一个小的应用案例:
class Visit_num(object):
    # 类属性
    num = 0

    def __init__(self):
        Visit_num.num += 1
        print('此页面共访问了{0}次'.format(self.num))

v1 = Visit_num()
v2 = Visit_num()
v3 = Visit_num()
print(Visit_num.num)        # 3

多态

"""
多态:不同的子类对象调用相同的父类方法。产生不同的执行结果,可以增加代码外部的灵活性
多态的前提:
        继承
        重写(子类重写父类的方法)
注意:Python中的多态可以没有继承关系,但必须要有相同的方法名
"""
class Animal(object):
    def run(self):
        print('animal run')

class Dog(Animal):
    def run(self):
        print('dog run')

class Cat(Animal):
    def run(self):
        print('cat run')


class AAA(object):		# 没有继承Animal类
    def run(self):
        print('AAA run')

def run_two(animal1):
    animal1.run()
    animal1.run()

dog = Dog()
cat = Cat()
a = AAA()

run_two(dog)
run_two(cat)
run_two(a)

模块:

# 模块:通俗讲,就是一个.py文件,用来管理功能代码,里面可以定义变量、函数、类
# 查看python中的内置模块
# help('modules')

# 自定义模块
# 导入模块
import first_module     # 当导入模块并执行当前文件的时候,就会执行一遍导入的那个模块
print(first_module.g_num)
first_module.show()
stu = first_module.Student('zf', 30)
stu.show_msg()

print(__name__)

first_module代码:

# 定义一个全局变量
g_num = 50000

# 函数
def show():
    print('这是一个函数')

# 类
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show_msg(self):
        print(self.name, self.age)

# 判断当前执行的住模块是谁,避免其他模块导入该模块时该模块中的方法调用
if __name__ == '__main__':
    print(__name__)
    show()

模块的导入方式:

"""
模块的导入方式:
    1. import 模块文件      导入整个模块,在需要使用模块的时候,先拿模块,再拿功能代码
    2. from 模块名 import 功能代码     推荐使用
    3. from 模块名 import *    导入模块中的功能代码(不推荐)
    4. 给模块起别名
        from 模块名 import 功能代码 as 别名
        使用场景:
            1)导入的名字比较长
            2)导入模块中的方法和自己的文件中的方法同名的时候
"""
# 栗子:
1. import 模块文件      导入整个模块,在需要使用模块的时候,先拿模块,再拿功能代码
import first_module
first_module.show()     # 这是一个函数
print(first_module.g_num)       # 50000

# 2. from 模块名 import 功能代码     推荐使用
from first_module import show
from first_module import g_num
show()      # 这是一个函数
print(g_num)        # 50000

# 3. from 模块名 import *    导入模块中的功能代码(不推荐)
from first_module import *
show()      # 这是一个函数

# 4. 给模块起别名
        from 模块名 import 功能代码 as 别名
from first_module import show as show_info
show_info()     # 这是一个函数

拓展:当要导入的模块和当前文件不在同一目录下时:

# 拓展:当要导入的模块和当前文件不在同一目录下时:
# test_module文件在桌面
import sys
sys.path.append("C:\\Users\\86187\\Desktop")
import test_module
dog = test_module.Animals('阿拉斯加')
dog.show()

test_module代码内容:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值