与对象的第一次相遇

 

类,其实就是一类具有共同特征的事物。古人说,“物以类聚,人以群分”,说的也是这个道理。生物学界的“界门纲目科属种”,其实也是按照事物某些共同的特征来划分的。

前面我们说到,类是具有共同特征的事物。所谓的共同特征在python中的属性。python中的属性分为数据属性和函数属性(类似于java中的属性和方法),而数据属性中又分为类属性和实例属性。也许你会问,数据属性为什么又要分为类属性和实例属性呢?存在一个“美女”类,她们共有的特征就是白皙的皮肤,漂亮的脸蛋,姣好的身材,我们可以把这些特征划为类属性。但是,她们每个人都是有这自己的特性,比如她们的名字、年龄等都是不尽相同的,因此,我们需要把这些定义为实例属性。函数属性,其实就是一些共有的行为方法。比如说,女明星都会唱歌跳舞。

现在,我们用python语言来实现一个“Beauty”类

 1 class Beauty:
 2    {"face":"鹅蛋脸","figure":"姣好","skin":"白皙"}#这些是类属性
 3     
 4      def __init(self,name,age):#这些是实例属性
 5           self.name=name
 6           self.age=age
 7 
 8       def sing():#函数属性
 9             print("I can sing well")
10        def dance():
11             print("I can dance well,t                              对象在使用中,我们可以把类理解为一个模版。我们可以通过这个模版,来创建一些实例,也就是创建对象。对象就是类的实例。

 

 1 class Beauty:
 2     common={"face":"鹅蛋脸","figure":"姣好","skin":"白皙"}#这些是类属性
 3 
 4     def __init__(self,name,age):#这些是实例属性
 5           self.name=name
 6           self.age=age
 7           print("创建实例时,__init__()对象被调用了")
 8     def sing(self):#函数属性
 9            print("I can sing well")
10     def dance(self):
11            print("I can dance well,too")

 

  对象

前面,我们定义了一个“Beauty类”,现在,我们用这个模版来创建对象

 

1 LYF=Beauty("刘亦菲",18)
2 """通过这句代码,我们创建了LYF这个对象,这句代码的执行过程是当执行Beauty("刘亦菲",18)时,会自动去调用Beauty中的__init__(self,name,age)方法,并把实际参数“刘亦菲”传给name,18传给age,"""

 

运行代码,执行结果为

 

关于__init__()函数的误区:

__init__()函数,并不等同于java中的构造方法。在执行__init__()之前,对象就已经被创建完成。

实例化对象的过程,我们可以分为两步:

1.创建对象 LYF=Object.__new__(Beauty)

2.初始化对象。LYF.__init__("刘亦菲",18)

 

 

通过观察,我们发现,上面的函数中都有一个self参数,代表什么意思呢?其实,self就是指函数的调用者,函数的调用者可以是对象,也可以是类。当调用者是类时,self位置参数必须用一个具体传入一个具体的实例对象,当调用者是对象时,self参数,可以省略,python解释器会自动把对象本身作为参数传进去。

 

 

类属性和对象属性                        

对于,我们创建的类时,除了我们自己定义的属性外,还包含了继承自Object类内置的属性。我们可以通过__dict__函数来查看类和对象的属性。

 1 class Beauty:
 2     common={"face":"鹅蛋脸","figure":"姣好","skin":"白皙"}#这些是类属性
 3 
 4     def __init__(self,name,age):#这些是实例属性
 5           self.name=name
 6           self.age=age
 7           print("创建实例时,__init__()对象被调用了")
 8           return None
 9     def sing(self):#函数属性
10            print("I can sing well")
11     def dance(self):
12            print("I can dance well,too")
13 LYF=Beauty("刘亦菲",18)
14 LYF.sing()
15 print(Beauty.__dict__)
16 print(LYF.__dict__)

执行上面的代码,运行结果为:



创建实例时,__init__()对象被调用了
I can sing well
{'__module__': '__main__', '__init__': <function Beauty.__init__ at 0x00000000021822F0>, 'sing': <function Beauty.sing at 0x0000000002182378>, 'dance': <function Beauty.dance at 0x0000000002182400>, '__dict__': <attribute '__dict__' of 'Beauty' objects>, '__weakref__': <attribute '__weakref__' of 'Beauty' objects>, '__doc__': None}
{'name': '刘亦菲', 'age': 18}




python内置类属性:
__dict__//得到一个属性字典,包括由类的数据属性和函数属性构成
__doc__//得到类的文档字符串
__name__//得到类的名字
__module__//得到定义类的模块
__bases__//得到所有的父类
class Beauty:
    common={"face":"鹅蛋脸","figure":"姣好","skin":"白皙"}#这些是类属性

    def __init__(self,name,age):#这些是实例属性
          self.name=name
          self.age=age
          print("创建实例时,__init__()对象被调用了")
          return None
    def sing(self):#函数属性
           print("I can sing well")
    def dance(self):
           print("I can dance well,too")

print(Beauty.__dict__)#得到一个属性字典,包括由类的数据属性和函数属性构成
print(Beauty.__doc__)#得到类的文档字符串
print(Beauty.__bases__)#得到父类的列表
print(Beauty.__module__)#得到定义类的模块
print(Beauty.__name__)#得到类名
print(Beauty.__dir__)

 

运行上面的代码,执行结果为:

python类属性中的函数属性:

1.实例方法

比如Beatuty类中的sing()/dance()方法都是普通方法。

普通方法与类的实例对象绑定,可以访问、操作类属性、实例属性。

2.类方法

类方法是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。其实,这也就类似于java中的静态方法。

类方法与类对象绑定,可以通过类名直接调用,类方法只能操作类属性,也就是公有属性。

@classmethod
def eat_food(cls):
    print("Everyone need food,if she wants to live")

运行结果为:

 

 

3.静态方法

静态方法 需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义cls /self参数,静态方法不能访问更不能操作类的属性和方法。

静态方法不需要绑定类的实例对象,也不需要绑定类对象。静态方法。

 

 

 

 

 4.属性方法

属性方法需要通过装饰器@property来进行修饰。

@property可以把一个实例方法变成其同名属性,以支持.号访问

 

 

 

 

 

 

  

 

 

 

 

 

 

 

---恢复内容结束---

posted @ 2018-05-31 16:55  南邪  阅读(323)  评论(0编辑  收藏  举报