Python之旅的第19天(类的初识)

之前看的应该都算是基础知识,然后今天听到类这个说法,刚开始感觉还是非常高大上的,但是慢慢看来,其实用函数式编程也是能实现的,但最终来说class还是牛逼的,那么今天就记录一下自己在引入类过程的认识吧。

1.类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体

2.那么问题来了,先有的一个个具体存在的对象(比如一个具体存在的人),还是先有的人类这个概念,这个问题需要分两种情况去看

在程序中:务必保证先定义类,后产生对象

下面先记录一下定义一个狗类的过程吧

# 首先的思路是狗狗都有什么功能
# 然后是狗有哪些属性
# dog1 = {'name' : 'wangcai',
#        'xingbie' : 'gong',
#        'type' : 'tianyuan'
#         }
# 下面是狗的功能
# def jiao(dog):
#     print('%s %s正在汪汪叫'%(dog['type'],dog['name']))
#
# def chishi(dog):
#     print('%s %s正在吃屎'%(dog['type'],dog['name']))
# 此时有一个人乱入了
# person_1 = {'name':'xiaoming',
#             'xingbie':'nan',
#             'type':'human'}
# jiao(dog1)
# chishi(dog1)
# 这样看来狗的功能实现了,但是这个时候xiaoming乱入也能调用方法
# jiao(person_1)
# chishi(person_1)
# 所以这样其实并没有达到最终效果
# 接下来我们使用变量的作用域来实现避免xiaoming乱入的情况

def dog(name,xingbie,type):
    def init(name,xingbie,type):
        dog = {'name':name,
               'xingbie':xingbie,
               'type':type,
               'chishi':chishi,
               'jiao':jiao
               }
        return dog
#此时开始设置狗的功能
    def jiao(dog):
        print('%s %s正在汪汪叫'%(dog['type'],dog['name']))

    def chishi(dog):
        print('%s %s正在吃屎'%(dog['type'],dog['name']))

    return init(name,xingbie,type)

d1 = dog('wangcai','gong','tianyuan')
print(d1)
#{'chishi': <function dog.<locals>.chishi at 0x000001F1AA394510>,
# 'xingbie': 'gong', 'name': 'wangcai',
# 'jiao': <function dog.<locals>.jiao at 0x000001F1AA394488>, 'type': 'tianyuan'}
# 这个时候就得到了一个字典,那么如何开始调用呢
d1['jiao'](d1)
d1['chishi'](d1)
# 这样我们就通过了字典的形式条用了在一开始的init函数中最后两个键值对中对应的函数
# 这个时候你再用person1,好像就不行了吧,dog函数把狗特有的功能放在dog函数作用域里面了
# 你如果传输xiaoming就有问题了o

# 然后紧接着是一个函数编辑类的练习
def school(name,addr,type):
    def init(name, addr, type):
        sch = {
            'name': name,
            'addr': addr,
            'type': type,
            'kao_shi': kao_shi,
            'zhao_sheng': zhao_sheng,
        }
        return sch
    def kao_shi(school):
        print('%s 学校正在考试' %school['name'])
    def zhao_sheng(school):
        print('%s %s 正在招生' %(school['type'],school['name']))
    return  init(name,addr,type)

s1=school('oldboy','沙河','私立学校')
print(s1)
print(s1['name'])

s1['zhao_sheng'](s1)

s2=school('清华','北京','公立学校')

print(s2)
print(s2['name'],s2['addr'],s2['type'])
s2['zhao_sheng'](s2)

#下面就到了引入神奇的类的时候了,还是以刚才的狗子为例
class Dog:
    def __init__(self,name,gender,type):
        self.name=name
        self.gender=gender
        self.type=type

    def bark(self):
        print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type))

    def yao_ren(self):
        print('[%s]正在咬人' %(self.name))

    def chi_shi(self):
        print('[%s]正在吃屎' %(self.type))


dog1=Dog('alex','female','京巴')
print(dog1.__dict__)
#这里需要注意,通过类调用的__dict__方法后,会得到一个关于类属性的字典
#这里我们调用法法时候就可以通过字典的形式调用

# dog2=Dog('wangcai','female','腊肠')
# dog3=Dog('dahuang','female','藏獒')
#比如这里的dog1.bark()
dog1.bark()
dog1.__dict__[bark]()

# dog2.yao_ren()
# dog3.chi_shi()
这几句没怎么看懂,放着继续理解一下,最近好像有点进入不求甚解的状态了

1. 站的角度不同,定义出的类是截然不同的

2. 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类......

3. 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类

下面是引用的别人测试,感觉不是很有难度,现在貌似进入新发修炼阶段,基本功虽然不怎么扎实,但是心法不学,没法突破
#方式一、为对象初始化自己独有的特征
class People:
    country='China'
    x=1
    def run(self):
        print('----->', self)

# 实例化出三个空对象
obj1=People()
obj2=People()
obj3=People()

# 为对象定制自己独有的特征
obj1.name='egon'
obj1.age=18
obj1.sex='male'

obj2.name='lxx'
obj2.age=38
obj2.sex='female'

obj3.name='alex'
obj3.age=38
obj3.sex='female'

# print(obj1.__dict__)
# print(obj2.__dict__)
# print(obj3.__dict__)
# print(People.__dict__)





#方式二、为对象初始化自己独有的特征
class People:
    country='China'
    x=1
    def run(self):
        print('----->', self)

# 实例化出三个空对象
obj1=People()
obj2=People()
obj3=People()

# 为对象定制自己独有的特征
def chu_shi_hua(obj, x, y, z): #obj=obj1,x='egon',y=18,z='male'
    obj.name = x
    obj.age = y
    obj.sex = z

chu_shi_hua(obj1,'egon',18,'male')
chu_shi_hua(obj2,'lxx',38,'female')
chu_shi_hua(obj3,'alex',38,'female')





#方式三、为对象初始化自己独有的特征
class People:
    country='China'
    x=1

    def chu_shi_hua(obj, x, y, z): #obj=obj1,x='egon',y=18,z='male'
        obj.name = x
        obj.age = y
        obj.sex = z

    def run(self):
        print('----->', self)


obj1=People()
# print(People.chu_shi_hua)
People.chu_shi_hua(obj1,'egon',18,'male')

obj2=People()
People.chu_shi_hua(obj2,'lxx',38,'female')

obj3=People()
People.chu_shi_hua(obj3,'alex',38,'female')




# 方式四、为对象初始化自己独有的特征
class People:
    country='China'
    x=1

    def __init__(obj, x, y, z): #obj=obj1,x='egon',y=18,z='male'
        obj.name = x
        obj.age = y
        obj.sex = z

    def run(self):
        print('----->', self)

obj1=People('egon',18,'male') #People.__init__(obj1,'egon',18,'male')
obj2=People('lxx',38,'female') #People.__init__(obj2,'lxx',38,'female')
obj3=People('alex',38,'female') #People.__init__(obj3,'alex',38,'female')


# __init__方法
# 强调:
#   1、该方法内可以有任意的python代码
#   2、一定不能有返回值
class People:
    country='China'
    x=1

    def __init__(obj, name, age, sex): #obj=obj1,x='egon',y=18,z='male'
        # if type(name) is not str:
        #     raise TypeError('名字必须是字符串类型')
        obj.name = name
        obj.age = age
        obj.sex = sex


    def run(self):
        print('----->', self)


# obj1=People('egon',18,'male')
obj1=People(3537,18,'male')

# print(obj1.run)
# obj1.run() #People.run(obj1)
# print(People.run)

关于类就是这些,确实是略叼,明天继续,迫不及待的感觉

猜你喜欢

转载自www.cnblogs.com/xiaoyaotx/p/12483909.html
今日推荐