一. 面向对象初识

1.1 回顾面向过程编程vs函数式编程

# 面向过程编程 测量对象的元素个个数。
s1 = 'fjdsklafsjda'
count = 0
for i in s1:
    count += 1


l1 = [1,2,3,4]
count = 0
for i in l1:
    count += 1
面向过程编程
def func(s):
    count = 0
    for i in s:
        count += 1
    return count
func('fdsafdsa')
func([1,2,3,4])
函数式编程

 

通过对比可知:函数编程较之面向过程编程最明显的两个特点:

1,减少代码的重用性。

2,增强代码的可读性。

1.2 函数式编程vs面向对象编程

# 函数式编程

# auth 认证相关
def login():
    pass

def regisgter():
    pass

# account 账户相关
def func1():
    pass

def func2():
    pass


# 购物车相关
def shopping(username,money):
    pass
def check_paidgoods(username,money):
    pass
def check_unpaidgoods(username,money):
    pass
def save(username,money):
    pass
函数式编程
class LoginHandler:
    def login(self):
        pass

    def regisgter(self):
        pass

class Account:
    def func1(self):
        pass

    def func2(self):
        pass

class ShoppingCar:
    def shopping(username,money):
        pass
    def check_paidgoods(username,money):
        pass
    def check_unpaidgoods(username,money):
        pass
    def save(username,money):
        pass
面向对象式编程

 

# 通过对比可以看出面向对象第一个优点:

面向对象编程:是一类相似功能函数的集合,使你的代码更清晰化,更合理化。

说第二个优点之前,先看看什么是面向对象。

面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。

那什么是类?什么是对象?

类:就是具有相同属性和功能的一类事物。

对象:就是类的具体表现。

具体一些:先解释解释什么是⻋? 有轱辘, 有⽅向盘, 有发动机, 会跑的是⻋. 好. 在解释⼀个. 什么是⼈. 有名字, 年龄, 爱好, 会唱歌跳舞思考的是⼈.那么广义上 车,人就是类:但是具体的我的车,你这个人这是一个对象。

猫,是一类,你们家养的 大橘。

狗,是一类,隔壁家养的那只二哈就是对象。

⾯向对象思维, 要⾃⼰建立对象. ⾃⼰建立场景. 你是就是⾯向对象世界中的上帝. 你想让⻋⼲嘛就⼲嘛. 你想让⼈⼲嘛⼈就能⼲嘛。

再说第二个优点:面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来(慢慢体会)。

1.3类的结构

 
class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
        print('人类会工作')
class 是关键字与def用法相同,定义一个类。
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:
静态变量。
动态方法。
 
s1 = 'fkdsjdsjfksdalfksld'
# count = 0
# for i in s1:
#     count += 1
# print(count)


# def mylen(argv):
#     count = 0
#     for i in argv:
#         count += 1
#     return count
# mylen(s1)

# 结构上理解:面向对象:两部分
class A:
    name = 'alex' #  静态属性,静态变量,静态字段。

    def func1(self):  # 函数,动态属性,方法。
        pass

# 函数vs面向对象


def register(argv):
    pass

def login(argv):
    pass
def shoppingcar(argv):
    pass


class Shopping_Car:
    def __init__(self):  # 特殊方法
        pass

    def register(self):
        pass

    def login(self):
        pass
    def shoppingcar(self):
        pass

# 1,函数封装一个功能,而面向对象封装多个相关的功能。
# 2,面向对象抽象,它是一种思想,站在上帝的角度去理解他。
# 3,程序可扩展,对象都是一个个独立的。耦合性,差异性。


# 类,对象。
# 类:具有相同属性或者功能的一类实物。
#对象:对象是类的具体体现。
课堂笔记

 

二. 从类名的角度研究类

2.1 类名操作静态属性

   2.11 第一种,查看类中的所有内容:类名.__dict__方式。

 
class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
        # print(self)
        print('人类会工作')

print(Human.__dict__)
print(Human.__dict__['mind'])
Human.__dict__['mind'] = '无脑'
print(Human.__dict__)  # 错误
#通过这种方式只能查询,不能增删改.

# 第一种方式只用户查询全部内容(一般不用单独属性查询).
 

  2.12 第二种:万能的点.  

 
class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
        # print(self)
        print('人类会工作')
print(Human.mind)  # 查
Human.mind = '无脑'  # 改
print(Human.mind)
del Human.mind  # 删
Human.walk = '直立行走'
print(Human.walk)
# 通过万能的点 可以增删改查类中的单个属性
 

  对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种__dict__方法,如果只是操作单个属性则用万能的点的方式。

2.2 类名操作动态方法

  前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法。

 
class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
        # print(self)
        print('人类会工作')
    def tools(self):
        print('人类会使用工具')

Human.work(111)
Human.tools(111)
下面可以做,但不用。
Human.__dict__['work'](111)
 

三. 从对象的角度研究类

3.1 什么是对象

对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。

执行下列代码会发生什么事情?

 
class Human:
    mind = '有思想'
    def __init__(self):
        print(666)
        print(self)  # <__main__.Human object at 0x00000191508AA828>

    def work(self): 
        print('人类会工作')

    def tools(self):
        print('人类会使用工具')
obj = Human() # 只要实例化对象,它会自动执行__init__方法
print(obj)  # <__main__.Human object at 0x00000191508AA828>
# 并且obj的地址与self的地址相同
 

其实实例化一个对象总共发生了三件事:

  1,在内存中开辟了一个对象空间。

  2,自动执行类中的__init__方法,并将这个对象空间(内存地址)传给了__init__方法的第一个位置参数self。

  3,在__init__ 方法中通过self给对象空间添加属性。

示例:

 
class Human:
    mind = '有思想'
    language = '使用语言'
    def __init__(self,name,sex,age,hobby):
        # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby

obj = Human('barry','男',18,'运动')

 

 

 

3.2 对象操作对象空间属性

  3.21 对象查询对象中所有属性。 对象.__dict__

 
class Human:

    mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
        # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby

obj = Human('barry','男',18,'运动')
print(obj.__dict__)  # {'n': 'barry', 'h': '运动', 's': '男', 'a': 18}
 

  3.22 对象操作对象中的单个属性。 万能的点 .

 
class Human:

    mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
        # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby

obj = Human('barry','男',18,'运动')
obj.job = 'IT'  # 增
del obj.n  # 删
obj.s = '女' # 改
print(obj.s)  # 查
print(obj.__dict__)
 

3.3 对象查看类中的属性

 
class Human:

    mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby

obj = Human('barry','男',18,'运动')
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a)
 

3.4 对象操作类中的方法

 
class Human:

    mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby

    def work(self):
        print(self)
        print('人类会工作')

    def tools(self):
        print('人类会使用工具')

obj = Human('barry','男',18,'运动')
obj.work()
obj.tools()
 

  类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.

self 是什么?

self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。

一个类可以实例化多个对象

obj1= Human('小胖','男',20,'美女')
obj2= Human('相爷','男',18,'肥女')
print(obj1,obj2)
print(obj1.__dict__)
print(obj2.__dict__)
# 一个公共框架,一个公共模型
# class Person:
#
#     animal = '高级动物'
#     walk_way = '直立行走'
#     language = '语言'
#
#     def eat(self):
#         print('该吃吃,该喝喝,啥事别忘心里搁')
#
#     def work(self):
#         print('人类都需要工作。。。')

# 类名
    # 1,查看类中的所有属性及方法 __dict__
# print(Person.__dict__)
# print(Person.__dict__['animal']) # 通过__dict__方式 单独的属性及方法可以查,但是不能增删改
# Person.__dict__['animal'] = '低级动物'
# Person.__dict__['name'] = 'alex'
# print(Person.__dict__)
# 工作中,学习中 一般用到 __dict__查看类中的所有属性及方法,不进行其他操作。
    #2,查看,(增删改)类中某个,某些属性 用     万能的点 .
# print(Person.animal)  # 查
# print(Person.language)
# Person.name = 'alex'  # 增
# print(Person.name)
# Person.animal = '低级动物' # 改
# del Person.walk_way  # 删
# print(Person.__dict__)
    #3,操作方法 一般不通过类名操作!!!
# Person.__dict__['work'](111) 不建议通过__dict__执行方法
# Person.work(666)

# 对象

class Person:

    animal = '高级动物'
    walk_way = '直立行走'
    language = '语言'

    def __init__(self,name,age,eye):  # 功能:给对象封装属性的。
        self.name1 = name
        self.age1 = age
        self.eye1 = eye

    def eat(self):
        # print(self)
        print('该吃吃,该喝喝,啥事别忘心里搁')

    def work(self):
        print('人类都需要工作。。。')

# obj = Person('alex',1000,'小眼睛')  # 这个过程是一个实例化过程,他会实例化一个对象(他会在内存实例化一个对象空间)。
# print(obj)
# print(obj.name1)
# 实例化过程内部进行了三个阶段:
# 1,在内存中开辟了一个对象空间
# 2,自动执行类中的__init__方法,并且将对象空间自动传给self参数,其他参数手动传入。
# 3, 执行__init__方法 给对象空间封装相应的属性。
obj = Person('alex',1000,'小眼睛')
# 对象:
    # 对象操作对象空间
        # 对象查看对象空间所有的属性  __dict__
# print(obj.__dict__)
        # 对象操作对象的某个属性 增删改查  万能的点.
# obj.sex = '男'  # 增
# del obj.eye1  # 删
# obj.eye1 = '大一点'  # 改
# print(obj.name1)
# print(obj.__dict__)
    # 对象操作类空间的属性 只能查
print(obj.animal)
obj.animal = '低级动物'
print(obj.animal)
print(obj.__dict__)
print(Person.__dict__)
    # 对象操作类空间的方法
# print(obj)
obj.eat()
类名对象的使用
公用模板,公共框架
class GameRole:

    rule = '游戏规则'
    hp = 1800
    def __init__(self,area,nickname,hp,ad):
        self.area = area
        self.nickname = nickname
        self.hp = hp
        self.ad = ad

    def attack(self):
        print('谁施展了一个攻击')

    def pen(self):
        self.pen=10000
gailun = GameRole('德玛西呀','草丛伦',1000,75)
print(GameRole.attack)
print(gailun.attack)
gailun.attack = '攻击力'
gailun.attack()
yasuo = GameRole('艾欧尼亚','托儿所',500,150)
penzi = GameRole('中国','键盘侠',10,100)
penzi.pen = 10000
penzi.pen()
print(penzi.__dict__)
1对象为什么能调用类中的属性与方法而且只是调用,不能改变?
gailun.属性名  先从自己空间去找,没有此属性他会通过类对象指针从类去找,  类中找不到,会从父类去找。
print(gailun.hp)
gailun.attack = 666  # 给对象增加一个属性 attack = 666
print(gailun.attack)
gailun.rule = gailun.rule  # '游戏规则'
# gailun.rule = 游戏规则'
# 对象.属性名='游戏规则'
print(gailun.rule)
gailun.nikename = '盖伦'
print(gailun.nickname)
对象只能查看类中的属性,不能增删改类中的属性。

2,类能不能调用对象的属性? 不能


print(GameRole.area)
3,对象与对象之间可不可互相调用?
同一个类实例化出来的对象之间是不能互相访问的。
不同类实例化的对象有可能互相访问。

给对象封装属性:__init__ 任意位置。
类名称空间,对象名称空间

 

 

 posted on 2022-03-31 17:42  编程之路任重道远  阅读(45)  评论(0)    收藏  举报