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() # 不需要实例化