面向对象的类和对象
类;一类事物,知识一个概念 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代码内容: