一文学完Python的面向对象学不会找我

目录

面向对象

数据成员

成员方法

访问控制

构造方法

self关键字

类方法和静态方法

封装

继承和抽象类

多态


面向对象

层级结构图

导入模块的几种方式

# 导入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中多继承就弥补了这个缺陷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值