3. 类与对象

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

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

在现实世界中:先有对象,再有类

世界上肯定是先出现各种各样的实际存在的物体,然后随着人类文明的发展,人类站在不同的角度总结出了不同的种类,如人类、动物类、植物类等概念;

也就说,对象是具体的存在,而类仅仅只是一个概念,并不真实存在。

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

这与函数的使用是类似的,先定义函数,后调用函数,类也是一样的,在程序中需要先定义类,后调用类不一样的是,调用函数会执行函数体代码返回的是函数执行的结果,而调用类会产生对象,返回的是对象

按照上述步骤,我们来定义一个类

在现实世界中,先有对象,再有类

#在现实世界中,站在学校的角度:先有对象,再有类
对象1:李坦克
    特征:
        学校=oldboy
        姓名=李坦克
        性别=男
        年龄=18
    技能:
        学习
        吃饭
        睡觉

对象2:王大炮
    特征:
        学校=oldboy
        姓名=王大炮
        性别=女
        年龄=38
    技能:
        学习
        吃饭
        睡觉

对象3:牛榴弹
    特征:
        学校=oldboy
        姓名=牛榴弹
        性别=男
        年龄=78
    技能:
        学习
        吃饭
        睡觉


现实中的学生类
    相似的特征:
        学校=oldboy
    相似的技能:
        学习
        吃饭
        睡觉

在程序中:先定义类,后产生对象

在程序中,务必保证:先定义(类),后使用(产生对象)
PS:
   1. 在程序中特征用变量标识,技能用函数标识
   2. 因而类中最常见的无非是:变量和函数的定义

# 程序中的类:

class Student:
    school = 'oldboy'
    def learn(self):
        print('is learning')

    def eat(self):
        print('is eating')

    def sleep(self):
        print('is sleeping')


# 注意:
 1. 类中可以有任意python代码,这些代码在类定义阶段便会执行
 2. 因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过Student.__dict__ 查看
 3. 对于经典类来说我们通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的,语法
 4. 点是访问属性的语法,类中定义的名字,都是类的属性


# 程序中类的用法

# .:专门用来访问属性,本质操作的就是__dict__

Student.school  #等于经典类的操作Student.__dict__['school']
Student.school='Oldboy'   # 等于经典类的操作Student.__dict__['school'] = 'Oldboy'
Student.x=1  #等于经典类的操作Student.__dict__['x']=1
del Student.x   # 等于经典类的操作Student.__dict__.pop('x')


# 程序中的对象
# 调用类,或称为实例化,等到对象
s1 = Student()
s2 = Student()
s3 = Student()


 如此,s1,s2,s3都一样了,而这三者除了相似的属性之外还各种不同的属性,这就用到了__init__
 注意:该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但一定不能有返回值

class Student:
    school = 'oldboy'

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex


    def learn(self):
        print('is learning')

    def eat(self):
        print('is eating')

    def sleep(self):
        print('is sleeping')


s1=Student('李坦克','女',18)    # 先调用类产生空对象s1,然后调用Student.__init__(s1,'李坦克','女',18)
s2=Student('王大炮','女',38)
s3=Student('牛榴弹','男',78)

# 程序中对象的用法
# 执行__init__,s1.name='李坦克',很明显也会产生对象的名称空间

print(s2.__dict__)

# run
{'name': '王大炮', 'age': '女', 'sex': 38}

s2.name #s2.__dict__['name']
s2.name='王三炮' #s2.__dict__['name']='王三炮'
s2.course='python' #s2.__dict__['course']='python'
del s2.course #s2.__dict__.pop('course')

__init__方法之为对象定制自己独有的特征*

#方式一、为对象初始化自己独有的特征
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')



**细说__init__方法**

#方式三、为对象初始化自己独有的特征
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)


posted @ 2018-05-16 11:32  云原生运维社区  阅读(98)  评论(0编辑  收藏  举报