目录
面向对象
层级结构图
导入模块的几种方式
# 导入requests模块
import requests
# 导入etree模块
from lxml import etree
#使用模块调用方法
requests.get()
etree.HTML()
类
面向对象最重要的就是类,类就是多个个体的汇聚,他是多数个体抽象出来的东西,比如动物这个类,他就是由猫,狗这些个体然后归为动物类,猫狗就是实例
但是猫狗也还可以继续分,可以按品种分,也可以按颜色分,但是动物是这些所有的基类Object,在java中也是,相当于最顶级的类了
一个类里面可以有很多东西,如下是一个类的定义
# 定义类
class User:
"""
类数据成员,所有对象都能访问到
类数据成员 User.name
"""
name = "小明" #类数据成员
age = 20 #类数据
# 构造方法
"""
定义在self方法里面使用self的属性叫做实例属性
"""
def __init__(self,father):
self.name = "小红" # 实例数据成员
self.mather = "jiajia"
self.father = father #通过初始化传参访问
"""
方法的命名采用下划线隔开一个单词
实例方法,使用def关键字定义的方法叫做实例方法,
这个方法必须必须包含参数self,而且必须是第一个
一个方法里面可以有多个实例方法
类不能直接访问
"""
def eat(self): #实例方法
# self优先访问当前实例对象的name值(小红),
# 如果没有那么就访问当前类属性(小明),
# 如果类属性没有,那就找父类的类属性
#
print(self.name+"吃饭")
print(self.sex)
print(self.mather)
#可以访问到定义在后面发实例方法(成员方法)
self.run()
def run(self): #实例方法
print(self.name+"跑")
数据成员
在其他语言中把数据成员叫做属性,也叫做成员变量,在python中数据成员分为两类,一类是类数据成员,一类是对象数据成员
特点:
类数据成员,类可以直接访问 类名.类数据成员名,类名.xxxx 直接访问的就是类数据成员,如果自己没有就去父类的类数据成员找,如果没有找到就报错,
类数据成员这个类的所有实例对象都能访问到,但是请注意如果对象数据成员
里面有和类数据成员名字相同,对象名.xxxx 访问到的是对象数据成员
对象数据成员只有当前对象能够访问到,这个类的其他对象是访问不到的
print("User.name:",User.name)
user = User()
print("user.name",user.name) #这里访问到的小红,如何小红不存在访问的就是小明
print("User.name:",User.name)
成员方法
在其他语言中方法也叫做成员方法,成员方法在python也叫实例方法,这种方法需要创建一个对象才能进行访问,类.成员方法这种访问是不行会报错的,
在成员方法里面,可以访问类数据成员,也可以访问对象数据成员,重名的话优先访问对象数据成员,也可以调用类的其他成员方法,类方法,静态方法
当两个方法重名的时候,会覆盖写在上面的方法,
def run(self): # 实例方法
print(self.name + "跑")
# 这个方法会覆盖上面的方法
def run(self, index):
print("djfaf", index)
user = User()
user.eat()
def eat(self): #实例方法
# self优先访问当前实例对象的name值(小红),
# 如果没有那么就访问当前类属性(小明),
# 如果类属性没有,那就找父类的类属性
#
print(self.name+"吃饭")
print(self.sex)
print(self.mather)
print("self.age",self.age)
print("User.age",User.age)
#可以访问到定义在后面发实例方法(成员方法)
self.run()
访问控制
私有成员:只有在类成员里面可以调用,在跨类或者子类都不能调用
__xxxxx
self.__mather = "jiajia"
def eat(self): # 实例方法
print(self.__mather)
保护成员:只有类创建的对象和子类对象能访问
_xxxx
self._father = father
print("父亲", user._father)
默认就是全局范围内都可以使用
构造方法
__init__
构造方法,创建对象的时候自动调用,构造方法是为了我们创建对象的时候给对象数据成员进行赋值。
self关键字
self关键字代表的就是对象本身,用在第一个参数,就是方便支这个方法,可以调用对象里面的数据成员和成员方法
类方法和静态方法
类方法没有什么复杂的,在类方法中只能方法类数据成员,对象数据成员和成员方法都访问不到,静态方法的调用
注
这个一点类方法和java中的静态方法一样,java中的静态方法里面是访问不了成员变量和成员方法的,因为首先会加载static修饰的方法和属性,其他对象的还没有加载
@classmethod
def jum(cls):
print("cls.age",cls.age)
类方法可以被类访问也可以被对象访问
User.jum()
user.jum()
静态方法和类方法差不多只是没有参数cls,访问也是可以被类访问也可以被对象访问,不过静态方法里面访问只能通过类名.访问类的数据成员和类方法
@staticmethod
def map():
print("User.age",User.age)
注
那么就没有办法用类名.成员方法吗?
还是有方法的把对象当参数传递给这个方法,这样类名访问就可以成功
User.run(user)
封装
封装就是将对象数据成员全部设置为私有的,想要获取值,可以通过成员方法get和set进行,值的获取和赋值。
class People:
def __init__(self,name,age):
self.__name =name
self.__age=age
def get_name(self):
return self.__name
def set_name(self,name):
self.__name = name
def get_age(self):
return self.__age
def set_age(self,age):
self.__age = age
u = People("雄安吗",12)
print(u.set_name("雄安"))
print(u.get_name())
继承和抽象类
python继承就是在括号里面写入父类,继承会继承父类的公开的数据成员私有的访问不了,和java里面差不多。
抽象类和java里面一样,必须重写抽象方法,不然创建对象的时候会报错
Can't instantiate abstract class Dog with abstract methods eat
import abc
class Animal(metaclass=abc.ABCMeta):
#抽象方法
@abc.abstractmethod
def eat(self,foot):
print("吃",foot)
# 继承动物
class Dog(Animal):
def f2(self):
print("afjal")
def eat(self,foot):
print("吃",foot)
多态
是指在基类的同一个方法在派生类中有不同的表现行为,也叫做重写父类方法,(在java中是多态的一种表现形式,还有继承也是多态的表现形式,还有父类对象引用可以指向多个子类对象,但是在python中不用给对象声明变量类型,但是定义一个变量的时候必须赋值,但是在java中不用)
在python没有接口这个概念但是python里面可以多继承,而java里面有接口,接口可以实现多个接口,而python中多继承就弥补了这个缺陷。