面向对象编程介绍

1.面向过程编程的核心是过程二字, 过程值得是解决问题的步骤, 先干什么再干什么最后干什么

2.面向对象编程的核心是对象二字, 对象是特征与技能的结合体

类与对象

# 实例化:类名加括号就是实例化>>>类名()
类的意思:种类,分类,类别
现实生活中,有一系列相同类别的对象(张三,李四..)>>人类)(边牧,金毛...)>>>犬类),归为类
程序中,先有类,才有对象
	class Person:		# 类名尽量使用大驼峰
    name = 'junjie'
    def run(self):
      pass
    Person = Person() # 对象(由类实例化得到的,类名())
    

什么是类?

"""
造一个张三:有体重身高,还有睡觉技能(特征与技能的结合体:属性和方法)
"""
# 定义一个类
# 类 Person
class Person():
    # 特征(属性)
    height = 180
    weight = 90
    # sleeph函数 就是方法 特征 self先不用管
    def sleep(self):
        print('睡觉技能')

# 定义一个对象
# 对象 zhangsan
zhangsan = Person()

# 使用对象
print(zhangsan.weight)
print(zhangsan.height)
zhangsan.sleep()
"""
90
180
睡觉技能
"""
# 仅为举例

什么是类2)?

# 定义一个学生类(学习属性,选课技能),实例化得到一个学生对象
class Student():
  school = 'oldboy'
  def choose_course(self):
    print('选课技能')
    
 stu = Student() # 类的实例化,得到对象
类名.__dict__
# __dict__ 是类的名称空间
# print(Student.__dict__)  双__ 开头暂时不用关注,写在类中的属性和方法,都在Stedent中
"""
/usr/local/bin/python3.6 /Users/macintoshhd/Desktop/python/面向对象/main.py
{'__module__': '__main__', 'school': 'oldboy', 'choose_course': <function Student.choose_course at 0x7fb73c1c56a8>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
"""
print(Student.school) # oldboy
print(stu.school) # oldboy
"""
如果对象stu.school的名称空间中没有属性,去类的名称空间中寻找
"""
下面插图

类的插图1)

类的查找顺序

class Student():
    # 属性
    school = 'oldboy'

    # 方法
    def choose_course(self):
        # 那个对象来调用,self就是哪个对象
        # print(self)
        print('选课技能')


stu = Student()  # 类的实例化,得到对象
stu1 = Student()
# 模拟s1去了北大
stu.school = '北大'

# 对象的名称空间中有属性,优先使用自身的,没有再去类寻找属性
# print(Student.school) # oldboy
# print(stu.school) # 北大
# print(stu1.school) # oldboy

# 对象调用方法,使用的是类中定义的方法
# 类中定义的方法是绑定给对象,对象来使用
# .choose_course() 就是使用方法

stu.choose_course() # 选课技能
stu1.choose_course() # 选课技能
# 对象属性的查找顺序,对象自己>>>类>>>报错
# 对象方法的查找顺序,所有对象都用类的方法>>>方法有self参数,通过self参数区分是那个对象调用的
类名.__dict__
对象.__dict__
print(stu.__dict__) # {'school': '北大'}
print(stu1.__dict__) # {} stu1的名称空间中没有属性
# 类中的属性应该写对象共有的属性,如果是对象自己的,需要放到对象自己的名称空间
stu.name = 'junjie'
stu.age = 10
print(stu.__dict__)

如何修改类的属性

 class Student():
    # 属性
    school = 'oldboy'
   # 方法
    def choose_course(self):
      # 那个对象来调用,self就是哪个对象
      # print(self)
      print('选课技能')

s1 = Student()
s1.school = '北大'  # 只能修改对象自己的名称空间,改不到类的属性
Student.school = '清华'
stu1 = Student()
stu2 = Student()
print(stu1.school) # 清华
print(stu2.school) # 清华

统计统计类实例化的次数(类和对象直接属性的关系 )

class Student():
    count = 0


s1 = Student()  # 实例化一次 数字+1
Student.count += 1
s2 = Student()
Student.count += 1  # 实例化一次 数字+1

s1.count += 1

# 类的名称空间count已经固定是2
print(Student.count) # 2
# s1 从类中取到两次count 再到自己的名称空间中产生count+=1 
print(s1.count) # 3


对象的绑定方法

# 函数:普通函数def定义的函数,调用有几个参数就需要传几个参数
# 方法:绑定给某个对象,方法有特殊之处:绑定给谁,谁来调用,谁来调用就会自动把谁传过来,传给self

class Student():
    # 属性
    school = 'oldboy'

    # 方法
    def choose_course(self):  # 定义再类的内部的函数,就是绑定给对象的方法
        # 哪个对象来调用,self就是哪个对象
        # print(self.name) # 通过self来区分,那个对象调用了自己的绑定方法
        print('%s这个人选课技能' % self.name)


s1 = Student()
# print(s1.__dict__) # {}
s1.name = 'xjj'
s1.choose_course()  # xjj这个人选课技能
# print(s1.__dict__)

s2 = Student()
s2.name = 'hnn'
s2.choose_course()  # hnn这个人选课技能

# 类可不可以调用方法? 可以调用,类来调用方法,方法就是一个普通函数
s1 = Student()
s1.name = 'junjie'
Student.choose_course(s1)
# 类可以调用对象的绑定方法,但是需要手动把对象传进来,有几个参数就传几个参数

双下init的使用

# 对象再实例化时,赋初始值(这里是给对象的属性)

class Student:
  def choose_course(self):
    print('选课')

# 之前的方法
stu1 = Student()
stu1.name = 'junjie'
stu1.age = 18

# 新方法
class Student:
  def __init__(self):
    self.name = 'junjie'
    self.age = 18
  def choose_course(self):
    print('选课')
    
stu2 = Student()
print(stu2.age) # 18
print(stu2.name) # junjie
# 但是
stu3 = Student()
print(stu3.name) # junjie
# 这样的写法固定死了所以__init__的终极使用方法

双下init的终极使用方法

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

    def choose_course(self):
        print('选课')

# 这种初始化方式会触发类的__init__的执行,并把参数传入
stu1 = Student(name='junjie',age=18) 
print(stu1.__dict__) # {'name': 'junjie', 'age': 18}
print(stu1.name) # junjie
print(stu1.age) # 18
stu2 = Student(name='jun',age=28)
print(stu2.name) # jun

总结

# 对象在实例化的时候,赋初值(给对象一些属性)


# class Student:
#     def choose_course(self):
#         print('选课')

# 之前的方案
# student1=Student()
# student1.name='lqz'
# student1.age=19


# 新方法
# class Student:
#     def __init__(self):
#         self.name='lqz'
#         self.age=19
#
#     def choose_course(self):
#         print('选课')
#
#
# student1 = Student()  # 只要是类实例化得到对象,就会自动触发__init__的执行
# print(student1.age)
# print(student1.name)
#
# student2 = Student()
# print(student2.name)


# __init__的终极使用
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def choose_course(self):
        print('选课')


# student=Student(name='lqz',age=19)  # 这种初始化方式会触发类的__init__的执行,并把参数传入
# print(student.name)
# egon=Student(name='egon',age=20)
# print(egon.name)


# 按位置传
# lqz=Student(20,'liuqingzheng')
lqz=Student('liuqingzheng',20)
print(lqz.name)

总结

# 类与对象
class 类名:
  pass
对象 = 类名()
字典,列表,数字...其实都是一些类的对象
# 对象的属性查找
"""
对象,属性---->先从对象自己的名称空间中找---->类的名称空间找----->报错
类中定义的属性,对象只能使用,不能修改
对象如果修改,改的是自己名称空间
"""
# 对象的绑定方法
"""
定义在类内部的函数,就是对象的绑定方法,对象来调用,会自动把对象传入(self)
类也可以来调用,类来调用,就是普通函数,有几个参数就要传几个参数

什么叫函数? 什么叫方法?
函数就是def 定义的函数,有几个参数就传入几个参数
方法是绑定给对象使用,由对象调用,特殊之处会把对象本身传入
"""
class Student:
  def choose_course(self):
    print(self)
s = Student
s.choose_course() # choose_course 就是方法
Student.choose_course() # 普通函数 就几个参数就传几个参数

# __init__的使用
初始化方法,类加括号实例化得到对象是,会触发它的执行
可以再初始化方法中,给对象赋初值
posted @ 2021-12-06 21:39  谢俊杰  阅读(95)  评论(0编辑  收藏  举报