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

Posted 崆峒山肖大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

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

以上是关于Python之旅的第19天(类的初识)的主要内容,如果未能解决你的问题,请参考以下文章

Python之旅的第15天(osjsonsys模块,模块引入补充)

Python之旅的第17天(re模块logging模块)

Python之旅的第30天(过程记录,选课系统的基本实现)

Python之旅的第3²天(内置函数文件基本打开关闭)

Python之旅的第3²+1天(文件操作迭代器生成器)

python之旅:面向对象之继承与派生