面向对象基础

1. 面向对象和面向过程

面向过程编程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么...基于面向过程编程的思想编写程序好比在设计一条流水线,是一种机械式的思维方式。

面向过程:
优点:复杂问题流程化,进而简单化
缺点:可扩展性差

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

基于面向对象编程的思想编写程序,就好比是在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式。

面向对象:
优点:可扩展性高
缺点:编写复杂

2. 类与对象

'''
对象:属性和方法的结合体
类:一系列共同的属性和方法

现实生活中:先有对象再有类
程序中:先有类再有对象

'''

'''
学生1:
    学校:老男孩
    姓名:吴子豪
    性别:女
    年龄:30
    方法:
        选课
        学习
学生1:
    学校:老男孩
    姓名:小吴
    性别:女
    年龄:18
    方法:
        选课
        学习
'''
# 定义类(类名建议用驼峰体命名)
# class关键字 类名
class Student:
    # 变量表示属性
    school = 'oldboy'
    def choose(self):
        print('选课')
    def study(self):
        print('学习')

# 生成对象   类加括号,生成对象
stu1 = Student()
# 获取属性和方法  通过 . 获取
print(stu1.school)   # oldboy
print(stu1.choose())  # 选课 
 None
# 查看类中的属性和方法
print(Student.__dict__)
print(Student.__dict__['school'])   # oldboy
print(Student.__dict__['choose'])   # <function Student.choose at 0x000002237C792EA0>
Student.__dict__['choose'](123)    # 选课
Student.choose(123)     # 选课
# print(Student.scool)   # 报错

# 获取对象的属性和方法
stu1 = Student()
print(stu1.__dict__)   # {}
print(stu1.school)    # oldboy
# 对象来调用方法,第一个参数不用传
print(stu1.choose)  # <bound method Student.choose of <__main__.Student object at 0x000001DE86039128>>
stu2 = Student()
print(stu2.school)  # oldboy
# 对象自己的属性和方法

stu1 = Student()
stu1.name = 'nick'
stu1.school = 'xxxx'
print(stu1.school)   # xxxx
print(stu1.__dict__)   # {'name': 'nick', 'school': 'xxxx'}
# 属性查找顺序
# 先从对象自身找---->类中找---->报错
Student.school = 'xxx'
stu1 = Student()
print(stu1.school)   # xxx
# 像对象中放属性
# 第一种方式:
stu1 = Student()
stu1.name='nick'
# 第二种方式:通过__init__方法
class Student:
    # 变量表示属性
    school = 'oldboy'
    def __init__(self,name):
        self.name = name
    def choose(self):
        print('选课')
    def study(self):
        print('学习')

# 产生对象
# stu1 = Student()
stu1 = Student('nick')
# 内部帮我们做了一些事:当我在实例化产生对象的时候,会自动调用__init__方法,完成对象的初始化
print(stu1.name)   # nick
stu2 = Student('jason')
print(stu2.name)   # jason

def change(obj,name):
    obj.name = name

stu1 = Student('xxx')
Student.__init__(stu1,'nick')
change(stu1,'nick')
print(stu1.name)   # nick

stu2 = Student('bob')
print(stu2.name)   # bob

3. 绑定方法

# 绑定方法:
# 定义在类内部的方法:
# 如果类来调用:就是一个普通函数,有几个参数就需要传几个参数
# 对象来调用:他叫对象的绑定方法,第一个参数不需要传,自动传递
class Student:
    # 变量表示属性
    school = 'oldboy'
    def __init__(self,name):
        self.name = name
    def choose(self):
        print('选课')
    def study(self):
        print(f'{self.name}学会了python')

stu1 = Student('nick')
stu1.study()
stu1 = Student('bob')
stu1.study()

4. 一切皆对象

# python中,字典,列表,字符串...都是对象
# 类即类型
# l1 = [1,2,3]
# 类实例化产生对象
l1 = list([1,2,3])
l2 = list([5,6,7])
# 对象调用对象的绑定方法,修改对象自己
l1.append(5)
print(l1)   # [1, 2, 3, 5]

list.append(l1,9)
print(l1)   # [1, 2, 3, 5, 9]

print(type(l1))   # <class 'list'>

class Student:
    school = 'oldboy'
    def choose(self):
        print('选课')
    def study(self):
        print('学习')
a = Student()
print(type(a))   # <class '__main__.Student'>

5. 人狗大战

# 人狗大战
# 定义一个狗类
class Dog:
    type_dog = '哈士奇'
    def __init__(self,name,aggressivity,hp=100):
        self.name = name
        self.aggressivity = aggressivity
        self.hp = hp
    def bite(self,target):
        # 当前狗的攻击力:self.aggressivity
        # 人的血量:target.hp
        target.hp -= self.aggressivity
        print(f'''
        狗的品种:{self.type_dog}
        {self.name}狗咬了一下{target.name}
        人掉血:{self.aggressivity}
        人的血量剩余:{target.hp}
        ''')

class Human:
    def __init__(self,name,aggressivity,hp=100):
        self.name = name
        self.aggressivity = aggressivity
        self.hp = hp
    def bite(self,target):
        target.hp -= self.aggressivity
        print(f'''
        {self.name}人咬了一下狗{target.name}
        狗掉血:{self.aggressivity}
        狗的剩余血量:{target.hp}
        ''')

# 实例化产生狗对象
dog1 = Dog('haha',20)
human1 = Human('bob',50)
dog1.bite(human1)
print(human1.hp)
human1.bite(dog1)
print(dog1.hp)
原文地址:https://www.cnblogs.com/yushan1/p/11413166.html