python必备知识点,Python的基本知识
#前言
面向对象编程离不开类。通过实例化类,创建了对象。还有一些关于PYTHON类的知识点或者难点需要研究和探讨。本文主要从以下几个方面进行论述:
基本属性的类型和范围方法的类型及区别;关于理解多态、继承和重写的问题;多重遗传
#基本功能
使用class定义类的属性和方法。基本形式如下:class person:count=0 def _ _ init _ _(self,name): self。name=name def work (self):打印“work”。一旦你有了一个类,你就可以通过它创建对象。类的基本特征是封装、继承和多态。
封装很容易理解。属性和方法封装在类中,具体的东西用类来描述。
继承,由一个类创建的对象,具有该类的属性和方法,或者可以从该类派生出一个子类,该子类可以继承父类的属性和方法。
多态性的概念不容易解释清楚,这将在下面讨论。
#属性的类型和范围
属性分为:
属性类属性
# #类别属性
有些书叫实例变量或者类变量。例如,前面代码中的count是一个class属性,class属性存在于class范围内。类作用域中的属性特征:可以被类访问,可以被所有实例访问,可以被屏蔽。
示例:class person:count=0 def _ _ init _ _(self,name):self . name=name def increase(self):person . count=1 defwork(self):打印 work 操作如下:
P1=坚持(张三)P1。增加()P2=坚持(李斯)P2。increase()print persistence . count print P1 . count是可见的,可以由类和实例访问。如果执行
P1 . count=10 print P1 . count print person . count可见类的计数被P1的计数屏蔽。
# #实例属性
instance属性很简单,就是在实例中使用,Person类的名字就是instance属性,通常由self声明。构造函数中的XXX。
# #私人
#方法的类型和差异
这里提到的方法是指类中定义的方法,包括:
方法静态方法类方法构造函数
# #实例方法
类中指定的参数中有(self)方法,与函数不同。
例如,亲自增加(自我)的方法
如果increase()方法参数中什么都没写,虽然代码没有报错,但是好像这个方法也不能用了。班级人员:def AAA():打印“a”.person.aaa () traceback(最近一次调用last):moduleTypeError中文件 stdin 的第1行:调用未绑定方法aaa()时必须将person实例作为第一个参数(结果什么也没有得到)p=Person() p.aaa() Trace back(最近一次调用last):module type中文件 stdin 的第1行错误:aaa()不带任何参数(给定1)# # class方法
用@classmethod修饰的方法是类方法,例如
班级人员:
计数=0
@classmethod
def cmeth(cls):
打印客户数量
相当于:
班级人员:
计数=0
def cmeth(cls):
打印客户数量
cmeth=classmethod(cmeth)
# #静态方法
用@staticmethod修饰的方法是静态方法,参数是空的,不用写什么,比如:
班级人员:
…@静态方法
… def smeth():
…打印“静态方法”
这有什么用?我觉得好像是定义在类里的函数,而且好像函数也可以代替它的函数。
# #比较这三种方法
主要区别在于参数。方法的隐含参数是类实例self,而类方法的隐含参数是类本身的cls。
静态方法没有隐式参数。
# #构造函数
用init()做
我不多说了。
#继承和重写的问题
继承,参见下面的例子:
班级人:def __init__(self,name):self . name=name班级学生(Person):pass班级老师(Person): def __init__(self,Age): self。age=ages=student(张三)print s.name t=Teacher(30)print t . name输出s . name可以看出,student类继承了父类的name属性,但是老师由于重写构造函数丢失了name属性,导致了错误。
继承父类的构造函数的编写
因此,如果需要重写构造函数,就需要继承父类的构造函数。否则,如果父类中的实例属性没有被继承,您可能会得到一个错误。它是这样写的:
第一种方法:
班主任(人):def _ _ init _ _(本人,姓名,年龄):人。_ _ init _ _ (self,name)self . age=aget=teacher( Lisi ,30) printt.name显式调用父类构造函数解决问题,或者super第二种方法。
班级人:def __init__(自己,姓名):Self . name=name班主任(人):def __init__(自己,姓名,年龄):超级(老师,自己)。_ _ init _ _(name)self . age=aget=teacher( Lisi ,30) printt.name使用super后发现错误,
Traceback(最近一次调用last):File /Users/wz/class _ python . py ,第10行,在模块t=Teacher(lisi ,30)File /Users/wz/class _ python . py ,7,在_ _ init _ _ super (teacher,self)。_ _ init _ _(name)type错误:super()参数1必须是type,而不是class obj。这里需要注意的是,使用super时,父类必须有继承的类,如果没有,使用object。
修改为:
class person(object):def _ _ init _ _(self,name): self.name=name所以没问题。这两种方法有什么区别?
建议使用super,在处理多重继承时会更智能。
#再次谈论多态性
而且继承和封装都很好理解,那么多态应该怎么理解呢?
从字面上看,多态性是多种形式。我觉得多态性可能体现在很多方面。
例如,person类继承学生和教师。这是不是也是人的各种形态,属于多态的范畴?
比如方法重复后,有很多形式。
再比如list dict有len功能。是否多态?
您可以使用对许多类型进行操作。运算符是多态的吗?
所以我觉得多态性可能体现在各个方面。有了类和继承,类多态自然就出现了。
#多重继承
指一个子类继承多个父类,这在java中似乎是不允许的,但是java可以实现多个接口。
这里需要注意的是,先继承父类的方法优于老师的方法。
先写这么多课堂上需要注意的知识点,感觉可能没有全部总结,想到了再补充。
#参考:
Python类属性和实例属性http://python.jobbole.com/85100/的探讨
Python超级用法:
https://www.cnblogs.com/wjx1/p/5084980.html
https://www.cnblogs.com/lijunjiang2015/p/7802410.html的私有制
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。