zoukankan      html  css  js  c++  java
  • 与对象的第一次相遇

     

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

    前面我们说到,类是具有共同特征的事物。所谓的共同特征在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可以把一个实例方法变成其同名属性,以支持.号访问

      

     

     

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

    在我身后,微笑地活下去吧。
  • 相关阅读:
    php算法之选择排序
    php算法之插入排序
    五分钟读懂UML类图
    ZC_知识点
    JNI_C#
    JNI_Z
    20160419__第1课_第6课
    Hibernate异常_01
    ZC_注意点
    ZC_知识点
  • 原文地址:https://www.cnblogs.com/L-C98/p/9117604.html
Copyright © 2011-2022 走看看