python的封装、继承、多态

    • php语言
    • 类及类的继承(以及多重继承)
    • 实例—类名()
    • __init__方法(类的属性,给类加属性)—创建方法时会被自动调用
    • 类的方法
    • 私有变量( 只有类的内部可以访问)
    • 不同的self
    • 组合—把不具备继承关系的平行类放到一个类中(在类中实例化对象就好)
    • Python中的BIF就是Built-in Functions,即内置函数的意思*
    • 模块—import +模块名(在Python可理解为对应于一个文件)
    • python 中__name__ = '__main__' 的作用
    • 包(package)
    • 爬爬爬爬虫
    • Python中模块与包的导入

php语言

PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域

类及类的继承(以及多重继承)

类的名字首字母必须要大写
class Student(如果继承的话,写父类,否则为空):
    pass

多重继承
在这里插入图片描述

import random as r

class Fish:
	def._init_(self):
		self.x=random(1,10)
		self.y=random(1,10)
	def.move(self):
		self.x-=1
		print("我的位置是",self.x,self.y)
class Goldfish
	pass
class shark(Fish):
	def._init_(self):
		super._init_(self)//对父类属性的初始化
		self.hungry=True//加上子类的属性
	def eat(self):
		if self.hungry:
			print("吃饱啦")
			self.hungry=False
		else:
		print("太撑了,吃不下啦")

实例—类名()

student = Student()

__init__方法(类的属性,给类加属性)—创建方法时会被自动调用

由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去:

class Student(object):
    def __init__(self, name, score)://加上了name和score属性
        self.name = name
        self.score = score

>>>student = Student("Hugh", 99)//实例化传参之后的对象,self不用写
>>>student.name
"Hugh"
>>>student.score
99
      

(1)、__init__方法的第一参数永远是self
表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
(2)、有了__init__方法 在创建实例的时候,就不能传入空的参数了
必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:

类的方法

class Student(obiect):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print "%s: %s" % (self.name, self.score)


>>>student = Student("Hugh", 99)
>>>student.print_score
Hugh: 99

私有变量( 只有类的内部可以访问)

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

//self.name 代表整个类里边的变量,name表示外边传进来的变量
class Student(object):
    def __init__(self, name, score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print "%s: %s" %(self.__name,self.__score)

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:


>>> student = Student('Hugh', 99)
>>> student.__name
Traceback (most recent call last):
  File "", line 1, in <module>
  
AttributeError: 'Student' object has no attribute '__name'

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:

class Student(object):
    ...
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
 如果又要允许外部代码修改score可以给Student类增加set_score方法:
    def set_score(self, score):
        self.__score = score

不同的self

1、属性中的self
self.name 代表整个类里边的变量,name表示外边传进来的变量 即把传入的外部变量,赋到类中的内部变量中去
2、方法中的变量,def get_score(self):
是为了实例化多个对象时,标识对象本身

组合—把不具备继承关系的平行类放到一个类中(在类中实例化对象就好)

比如说定义一个水池类,水池里面有鱼和乌龟

class Turtle:
	def._init_(self,x):
		self.num=x

class fish:
	def._init_(self,y):
		self.num=y

class pool:
	def._init_(self,x,y):
		self.turtle=Turtle(x)
		self.fish=Fish(y)
	def.whatpool(self,x,y):
		print("水池里面有%d只鱼和%d只乌龟,"%(self.fish.num,self.Turtle.num))

pool=new pool(1,10)
pool.whatpool()

Python中的BIF就是Built-in Functions,即内置函数的意思*

检测一个类是否是另一个类的子类
python的封装、继承、多态_第1张图片

issubclass(B,object)
true

检测一个实例对象是否属于一个类
在这里插入图片描述
测定一个对象是否有某个属性(name要以字符串的形式,否则函数会以为x是一个变量)
在这里插入图片描述
返回该对象中该参数的指定值
在这里插入图片描述

class A:
	def._init_(x):
		self.x=x


getattr(A,'x',"您所访问的属性不存在")

设置对象中指定属性的值
在这里插入图片描述
删除对象中指定的属性
在这里插入图片描述

模块—import +模块名(在Python可理解为对应于一个文件)

python的封装、继承、多态_第2张图片

1,improt 模块名
调用:模块名.功能名
2,import 模块名 as 别名
调用:别名.功能名
3,from 模块名 import 功能名
调用:直接功能名
4,from 模块名 import 功能名 as 别名
调用: 直接拿别名来用
5,from 模块名 import*
(用 * 号 一次性导入所有功能)
调用:直接功能名 注意点:* 号没法用别名

python 中__name__ = ‘main’ 的作用

让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。

#module.py
def main():
  print "we are in %s"%__name__
if __name__ == '__main__':
  main()

这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出”we are in main“,说明我们的if语句中的内容被执行了,调用了main():
但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢

from module import main
main()

其执行的结果是:we are in module
但是没有显示”we are in main“,也就是说模块__name__ = ‘main’ 下面的函数没有执行。
这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。

总结(部分代码的执行与否)

如果我们是直接执行某个.py文件的时候,该文件中那么”name == ‘main’“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if name == ‘main’“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

包(package)

init文件的作用,是告诉 把这个文件当作包来管理
python的封装、继承、多态_第3张图片

爬爬爬爬虫

URL组成:协议、域名、路径
python的封装、继承、多态_第4张图片

Python中模块与包的导入

python的封装、继承、多态_第5张图片python的封装、继承、多态_第6张图片
python的封装、继承、多态_第7张图片

你可能感兴趣的:(python)