码迷,mamicode.com
首页 > 其他好文 > 详细

002--对象和类

时间:2018-04-12 23:25:16      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:ini   实例   对象   --   问题   turn   pre   面向对象设计   return   

对象和类                                                          

对象是什么?                                                     

在面向对象编程中,对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法。

对象:类的实例 

 

 

类是什么?                                                        

类即类别、种类,是面向对象设计最重要的概念。

类:一种对象,每个对象都属于特定的类。

 

问题1:先有类还是先有对象?                                                   

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

  • 在现实世界中:肯定是先有对象,再有类
  • 在程序中:务必保证先定义类,后产生对象

 

 

创建自定义类                                                     

在Python中程序中的类:

  • 用class关键字定义
  • 关键字首字母大写
  • 特征用变量标识
  • 技能用函数标识

因而类中最常见的无非是:变量和函数的定义

 

一个简单的示例:

class Person:
    def set_name(self,name):
        self.name=name
    def get_name(self):
        return self.name
    def greet(self):
        print("hello,world! I am {}".format(self.name))

#创建两个实例
foo=Person()
bar=Person()
foo.set_name("Lucy")
bar.set_name("Jessie")
foo.greet()
bar.greet()

#输出
hello,world! I am Lucy
hello,world! I am Jessie 

从上面示例不难看出:

  • 该示例包含三个方法,他们类似于函数定义,位于class语句内。
  • self指向对象本身,例如:对foo调用set_name和greet时,foo都会作为第一个参数自动传给他们。

实际上,可以随便给这个参数命名,但鉴于它总是指向对象本身,因此习惯上将其命名为self。

 

 

类的使用                                                           

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

    def eat(self):
        print(is eating)

    def sleep(self):
        print(is sleeping)

 

1、引用类的属性                                                                         

OldboyStudent.school # OldboyStudent.school=Oldboy # OldboyStudent.x=1 # del OldboyStudent.x #

 

2、调用类                                                                                 

  • 或称为实例化,得到程序中的对象
s1=OldboyStudent()
s2=OldboyStudent()
s3=OldboyStudent()

#如此,s1、s2、s3都一样了,而这三者除了相似的属性之外还各种不同的属性,这就用到了__init__

 

3、__init__方法                                                                         

#注意:该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但一定不能有返回值
class OldboyStudent:
    ......
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    ......

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

 

 

对象的使用                                                        

1、查看对象的名称空间                                                             

  • cls.__dict__
#执行__init__,s1.name=‘牛榴弹‘,很明显也会产生对象的名称空间可以用s2.__dict__查看,查看结果为
print(s2.__dict__)
{name: 王大炮, age: , sex: 38}

 

2、对象的属性                                                                         

s2.name #查,等同于s2.__dict__[‘name‘]
s2.name=王三炮 #改,等同于s2.__dict__[‘name‘]=‘王三炮‘
s2.course=python #增,等同于s2.__dict__[‘course‘]=‘python‘
del s2.course #删,等同于s2.__dict__.pop(‘course‘)

 

补充说明                                                                                

  • 站的角度不同,定义出的类是截然不同的;
  • 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
  • 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类

 

 

函数 V.S 方法                                                     

方法(关联方法)将其第一个参数关联到它所属的实例,因此无需提供这个参数。当然可以将属性关联到一个普通函数,但这样就没有特殊的self参数了

举个例子:

1、类属性关联到函数:                                                             

class Class:
    def method(self):
        print("I have a self")
def function():
    print("I don‘t have self...")
instance=Class()
instance.method()
#输出结果
I have a self

instance.method=function
instance.method()
#输出结果
I don‘t have self...

注意:有没有参数self并不取决于instance.method的调用方法

 

2、让另一个变量指向同一个方法                                               

class Class:
    def method(self):
        print("I have a self")
def function():
    print("I don‘t have self...")
instance=Class()
ins=instance.method
ins()

#输出结果
I have a self

虽然最后一个方法调用起来看起来像函数调用,但变量ins指向的是关联的方法instance.method,这意味着它也能够访问参数self(即它也被关联到类的实例)

 

Mark on 2018.04.12

002--对象和类

标签:ini   实例   对象   --   问题   turn   pre   面向对象设计   return   

原文地址:https://www.cnblogs.com/JunSheep/p/8809562.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!