类
类,其实就是一类具有共同特征的事物。古人说,“物以类聚,人以群分”,说的也是这个道理。生物学界的“界门纲目科属种”,其实也是按照事物某些共同的特征来划分的。
前面我们说到,类是具有共同特征的事物。所谓的共同特征在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可以把一个实例方法变成其同名属性,以支持.号访问
---恢复内容结束---