zoukankan      html  css  js  c++  java
  • python3面向对象常用特性知识点

    1.常用跨类方法

    class test:
    
        def run(self):
            print(1)
    class test1(test):
        def run1(self):
            test().run()
    
    if __name__ == '__main__':
        test1().run1()  #非继承也可用

    注意__init__方法其实是创建一个空对象然后再进行赋值

    2.抽象类 :必须要继承abc的抽象方法,以abc装饰器来判断是否是抽象类,子类重写父类的接口方法(子类必须重写父类中的抽象方法,否则子类也是一个抽象类)

    import abc  #导入abc模块
    class InMa(metaclass=abc.ABCMeta):  #定义抽象方法
       @abc.abstractmethod       #定义抽象方法
       def login(self):
          pass
       @abc.abstractmethod
       def zhuce(self):
         pass
    class Login(InMa):  #继承抽象类
       def __inti__(self,name,pwd):
          self.name = name
          self.password = pwd
       def login(self):           #实现抽象方法功能
    
          if self.name == "qq" and self.password == "111":
             print("恭喜登录成功")
          else:
             print("登录失败")
    
    class Zc(Login):
       def __init__(self,name,pwd):
          self.name = name
          self.password = pwd
       def zhuce(self):
          print("恭喜注册成功")
          print("username:",self.name)
          print("password:",self.password)
     #实例对象
    ren = Zc("Jaue","qqq")
    ren.zhuce()

    3.@property方法 :property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 # obj.接口 直接调用

    import math
    class Circle:
        def __init__(self,radius): #圆的半径radius
            self.radius=radius
    
        @property
        def area(self):
            return math.pi * self.radius**2 #计算面积
    
        @property
        def perimeter(self):
            return 2*math.pi*self.radius #计算周长
    
    c=Circle(10)
    print(c.radius)
    print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
    print(c.perimeter) #同上

    4.@staticmethod静态函数

    import time
    class Date:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
        @staticmethod
        def now(): #用Date.now()的形式去产生实例,该实例用的是当前时间
            t=time.localtime() #获取结构化的时间格式
            return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回
        @staticmethod
        def tomorrow():#用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间
            t=time.localtime(time.time()+86400)
            return Date(t.tm_year,t.tm_mon,t.tm_mday)
    
    a=Date('1987',11,27) #自己定义时间
    b=Date.now() #采用当前时间
    c=Date.tomorrow() #采用明天的时间
    #重点: a是实例,b,c都是类也直接调用
    
    print(a.year,a.month,a.day)
    print(b.year,b.month,b.day)
    print(c.year,c.month,c.day)

    @classmethod与@staticmethod

    • 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,
    staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似

    • 有利于组织代码,同时有利于命名空间的整洁

    以上这篇基于python中staticmethod和classmethod的区别(详解)就是小编分享给大家的全部内容了,
    希望能给大家一个参考,也希望大家多多支持脚本之家。
    class A(object):
        def foo(self, x):
            print("executing foo(%s,%s)" % (self, x))
    
        @classmethod
        def class_foo(cls, x):
            print("executing class_foo(%s,%s)" % (cls, x))
    
        @staticmethod
        def static_foo(x):
            print("executing static_foo(%s)" % x)
    
    
    a = A()
    print(a.foo)
    # <bound method A.foo of <__main__.A object at 0x0375B450>>
    
    print(a.class_foo)
    # <bound method A.class_foo of <class '__main__.A'>>
    
    print(A.class_foo)
    # <bound method A.class_foo of <class '__main__.A'>>
    
    print(a.static_foo)
    # <function A.static_foo at 0x07CAE6F0>
    print(A.static_foo)
    # <function A.static_foo at 0x07CAE6F0>

     5.私有变量,方法

    class pub():
        _name = 'protected类型的变量'
        __info = '私有类型的变量'
        def _func(self):
            self.__func2()
            print("这是一个protected类型的方法")
        def __func2(self):
            print('这是一个私有类型的方法')
        def get(self):
            return(self.__info)
    
    a = pub()
    print(a._name)
    a._func()
    # a.__func2() 报错

    6.setter getter 用于判断变量,重写私有变量

    判断变量格式

    class Person(object):
    
        __privateVal=100
    
        def __init__(self, name):
            self.name = name
    
        @property
        def name(self):
            print("getter 被调用")
            return self._name
    
        @name.setter
        def name(self, name):
            print("setter 被调用")
            if not isinstance(name, str):
                raise TypeError("类型不匹配,应该为字符串型")
            self._name = name
    
    person = Person("Tom")
    print(person.name)

    重写私有变量

    class Person:
        # 只允许拥有私有的name和age属性
        __slots__ = ('__name', '__age')
        def __init__(self,name,age):
            self.__name=name
            self.__age=age
    
        @property
        def name(self):
            return self.__name
        @name.setter
        def name(self,name):
            print("setter开始")
            self.__name=name
    
        @property
        def age(self):
            return self.__age
    
        @age.setter
        def age(self, age):
            print("getter开始")
            # self.__age = age
        def __str__(self):
            return '姓名 '+self.__name+' 
    年龄'+str(self.__age)
    if __name__=='__main__':
        zhangsan=Person('张三',20)
        print(zhangsan)
        print(zhangsan.name)
        print(zhangsan.age)
        zhangsan.age=30
        zhangsan.name='张三三'
        print(zhangsan)

    7. classmethod类方法(在不需要生成对象的情况下调用类方法,必须传入cls意思是传入对象)

    class A(object):
        bar = 1
        def func1(self):  
            print ('foo') 
        @classmethod
        def func2(cls):
            print ('func2')
            print (cls.bar)
            cls().func1()   # 调用 foo 方法
     
    A.func2()               # 不需要实例化
  • 相关阅读:
    Linux命令基础
    ubuntu16.04修改ssh的端口
    ubuntu16.04没有办法使用CRT,或者SSH工具的解决办法
    如何启动、关闭和设置ubuntu防火墙
    ubuntu远程桌面软件vnc。
    CAD安装激活失败的原因
    如何调出电脑的任务管理器
    如何查看Windows10连接的WiFi密码
    如何知道和你在一个局域网的电脑个数?
    如何快速连上另一台电脑已共享的打印机
  • 原文地址:https://www.cnblogs.com/cjj-zyj/p/9946376.html
Copyright © 2011-2022 走看看