首页 > 编程语言 >python-面向对象三大特性

python-面向对象三大特性

时间:2022-12-16 15:12:07浏览次数:60  
标签:name python 子类 self 面向对象 def 父类 方法 三大

python-面向对象三大特性

封装

继承

多态

封装

'''封装
  封装就是把类的属性和方法封装到类的内部,只能在内部使用,不能在类外部使用
  把属性和方法前面加两个下划线,这个属性和方法就成为类的私有属性和私有方法'''

示例

#示例
class woman:
    def __init__(self):
        self.name="玛丽"
        self.__weight=200#在属性前面加两个下划线就属于这个类的私有属性
    def __eat(self):#这是一个类的私有方法
        print("%s胖是因为吃的多"%self.name)
w=woman()
print(w.name)#类的私有属性只能在类的内部使用,在外部无法调用私有属性和私有方法
#案例
'''设计一个类:user
    类的属性
        name,
            私有属性:__password
    类的方法
        show_name
            私有方法:__show_password'''
class user:
    def __init__(self):
        self.name="admin"
        self.__password="123456"
    def show_name(self):
        print(self.name)
    def __show_password(self):
        print(self.__password)
u=user()
u.show_name()#在类的外部不能访问私有属性和私有方法
#u.__show_password()/访问不了

  

继承

'''继承
  类A继承自类B
      那么类B会拥有类A的所有属性的方法
      但是如果类A中有私有属性/私有方法。类B无法继承'''

示例

class A:
    def __init__(self):
        self.name="这是类A的属性和方法"
    def show_name(self):
        print(self.name)
class B(A):
    def show_name(self):
        print(self.name)
b=B()#实例化类B创建对象b
b.show_name()#在类B中调用类A的属性和方法

  

有关继承的专业属于/别称

'''有关继承的专业术语
  子类==派生类
      子类:类B是类A的子类
      类B是类A的派生类
  父类=基类
      类A是类B的父类
      类A是类B的基类
  继承=派生
      类B继承自类A
      类B派生自类A'''
#一个父类可以拥有多个自类继承,每个子类可以拥有自己的特有方法和属性
class animal:#父类
    def sleep(self):#父类的方法
        print("睡")
​
    def eat(self):#父类的方法
        print("吃")
​
class dog(animal):#子类
    def run(self):#子类自己的方法
        print("跑")
​
class erha(dog):#二级子类
    def kawayi(self):#二级子类自己的方法
        print("萌")
​
e = erha()#创建二级子类的对象
e.sleep()#调用父类的方法
e.eat()#调用父类的方法
e.run()#调用一级子类的方法
e.kawayi()#调用二级子类的方法
'''类中可以不写属性'''

  

方法的重写

'''当父类的方法不能满足子类的需求
  方法重写的方式有两种
      覆盖父类的方法
      扩展父类的方法'''

覆盖父类的方法

'''当子类中出现与父类相同的方法,在子类中相同的方法会覆盖父类的方法'''
class cat:
    def sleep(self):
        print("这是父类的方法")
    def dink(self):
        print("这个是没有覆盖,子类可以正常调用的方法")
class car(cat):
    def sleep(self):
        print("此时子类的方法覆盖了父类的方法")
c1=car()
c1.sleep()#此时调用的方法就是属于子类自己的方法
c1.dink()#应为这个dink方法没有被子类覆盖,所以在子类创建的对象中任然可以正常使用

  


扩展父类的方法

#扩展父类的方法
'''如果父类的方法不满完全满足子类,子类可以在父类的方法基础上增加功能
    语法
        def 与父类相同的方法名:
            super().与父类相同的函数名
            扩展后执行的代码'''
class F:
    def fulei(self):
        print("这是父类原有的方法")
class s(F):
    def fulei(self):
        super().fulei()
        print("子类扩展了父类")
c5=s()
c5.fulei()#调用子类扩展后的方法
'''输出的结果并不会输出到一行而是输出为两个结果'''

  

父类的私有成员不会继承给子类

class fu:
    def name(self):
        print("这是父类的公有方法,可以继承给子类")
    def __ps(self):
        print("这是父类的私有方法,不会继承给子类")
class zi(fu):
    def zilei(self):
        pass
c1=zi()
c1.name()
#c1.__ps()不会继承给子类
#练习
class father:
    def __init__(self):
        self.name="张三"
        self.house="别墅"
    def sleep(self):
        print("睡")
    def eat(self):
        print("吃")
class son(father):
    def show_eat(self):
        self.eat()
    def show_sleep(self):
        self.sleep()
    def show_house(self):
        print(self.house)#house是一个属性不能调用只能在print里面输出
s=son()
s.eat()#这是父类的方法
s.show_eat()#这是子类的方法
s.sleep()#这是父类的方法
s.show_sleep()#这是子类的方法
s.show_house()#这是父类的属性

  

多态

'''多态
    不同的子类,调用相同的父类方法,产生不同的结果
    多态的前提是不同的子类来自同一个父类,子类覆盖父类的方法'''
class F:
    def fu(self):
        print("这是父类的方法")
    def fu2(self):
        self.fu()
class z1(F):
    def fu2(self):
        print("子类1覆盖了父类的方法")
class z2(F):
    def fu2(self):
        print("子类2也覆盖了父类的方法")
f=F()#给父类创建对象
f.fu2()#正常调用父类的方法
z=z1()#创建子类1的对象
z.fu2()#在子类中调用父类的方法
x=z2()#创建子类2的对象
x.fu2()#在子类2中调用父类的方法
'''在子类覆盖父类的情况下,不同的子类调用相同的父类方法时出现的结果也是不同的'''

  

类属性和类方法

'''类属性
  定义在类里面,方法外面,定义的时候不需要self关键字,语法类似于普通的变量
  不需要把类实例化为对象
  直接通过:
          类名.属性名使用'''
class dog():
    name="二哈"#在这个位置的变量叫类属性
    def __init__(self):
        pass
print(dog.name)#在类外面可以直接使用类名.类方法使用
dog.name="大黄"#也可以通过类名.类方法="值"进行修改

  

 

类方法

'''类方法
    类方法不需要把类实例化为对象,通过类名.类方法调用
    使用@classmethod修饰的方法就是类方法
    类方法的第一个参数时cls(不是self)
    类方法内部不能使用普通属性,也不能调用普通方法
        因为类方法和类属性是不需要通过实例化就可以进行调用,而普通方法和属性一定要通过实例化类才能调用'''
class dog1():
    name="富贵"#这是类属性
    @classmethod
    def set_name(cls,name):#这是类方法,可以通过类名.类方法名直接调用
        cls.name=name
    def __init__(self):#这是普通方法
        self.age=20#用调用类方法的方式无法调用普通方法必须实例化类才可以
print(dog1.name)#调用类属性
dog1.set_name("平安")#调用类方法
c=dog1()#实例化类
print(c.age)#实例化类以后才可以调用普通方法

  

在普通方法中使用类属性和类方法

'''在普通方法中使用类属性和类方法
    普通方法中通过
            类名.类属性
            类名.类方法
                    使用类属性和类方法'''
class dos:
    name="富贵"#类属性
    @classmethod#类方法使用@classmethod进行修饰
    def get_name(cls):#类方法
        return cls.name#调用类方法返回类属性的值
    def __init__(self):#普通方法
        dos.name="平安"#在普通方法里面修改类属性
        print(dos.get_name())#在普通方法里面调用类方法
c=dos()#实例化类
c.get_name()#在普通方法里面调用类方法
'''在普通方法里面使用类方法/类属性,需要将类实例化后才能使用'''

  

静态方法

'''在类中通过@staticmethod修饰的方法叫静态方法
    静态方法与类方法一致,不需要通过实例化类就可以进行调用
    通过:
        类名.静态方法名
            就可以调用静态方法
    静态方法不能访问类中的其他成员,静态方法就是一个堵路与类存在的函数'''
class doss:
    @staticmethod
    def help():#静态方法不用谢self和cls
        print("这是一个静态参数")
doss.help()
'''静态方法的使用场景
    当代码两特别大的时候,函数也会特别多,为了避免函数的重名,可以把同名函数放到不同的类里面,作为静态方法
    说人话就是个隔离窗口防止函数重名'''
class dog:
    @staticmethod
    def help():
        print("这是一个静态方法")
​
class A:
    @staticmethod
    def help():
        print("这是第二个静态方法help")
dog.help()
A.help()

  


 

标签:name,python,子类,self,面向对象,def,父类,方法,三大
From: https://www.cnblogs.com/wh0915/p/16987413.html

相关文章

  • Oracle的网络三大配置文件sqlnet.ora、tnsnames.ora、listener.ora
    1.说明为了使得外部进程能够访问Oracle 数据库则必须配置Oracle 网络服务器环境配置, Oracle 网络服务器环境是通过配置listener.ora、sqlnet.ora 和 tnsnames.ora ......
  • 海量数据、广泛适配、产品稳定,极验三大独有能力打造差异化验证码产品
    引言:深耕交互安全这一细分领域十年,极验在十年间服务36万客户,自全球124个国家与地区的客户端用户都曾使用过极验的产品。极验在银行、金融证券和航空出行等10个细分行业的平......
  • 如何用python自动化微信小程序
    如何微信小程序自动化抢到跨境安最近,接到一个这样的需求,最终交付的结果如下:为了保护隐私,做了马赛克的处理。一、界面的实现程序提供一个界面,用于启动模拟器和实现启动抢票脚......
  • 利用python将分表数据复制粘贴到总表的案例
    importpandasaspdfrompandasimportDataFrame,Seriesexecl_total=pd.read_excel(r'E:/汇总.xlsx',sheet_name='Sheet1',index_col=0)execl_a=pd.read_excel(r'E:/......
  • inf 和 nan在python
    infpython中的正无穷或负无穷,使用float("inf")或float("-inf")来表示写成:float("inf"),float("INF")或者float('Inf')都是可以的,比较的时候相等inf是一个超出浮点表示范......
  • python 爬取 国家统计局官网 的统计用区划和城乡划分代码 发现了惊天秘密!!!附python
    国家统计局官网的统计用区划和城乡划分代码 地址 ​​http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/​​最新数据是2021年的 http://www.stats.gov.cn/tjsj/tjbz/......
  • python爬虫教程
    ​​python爬虫入门教程(一):开始爬虫前的准备工作​​​​python爬虫入门教程(二):开始一个简单的爬虫​​​​python爬虫入门教程(三):淘女郎爬虫(接口解析|图片下载)​......
  • selenium三大等待
    使用场景:有时候当我们操作页面元素时,需要等待这个过程才能操作成功。做Ui自动化的时候,考虑到稳定性:多次运行同一脚本,都能够保证它是成功的。一、强制等待:sleep(秒)比......
  • python38
    Python break语句Pythonbreak语句,就像在C语言中,打破了最小封闭for或while循环。break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止......
  • python面向对象程序设计
    python-面向对象程序设计1:类类就是一个图纸类不可以直接使用类中的行为叫类方法类中的特性叫类属性2:对象对象时根据类创建出来的,可以直接使用一个类可以创建多个对象每......