类中方法辨识和作用

面向对象

一、@staticmethod 和 @classmethod

Python中有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法

如下:

class B(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)

# 新建一个实例
b = B()
# 实例方法只能被实例化对象调用
b.foo("method")
B.foo(B(),"method")
# 类法 既可以呗对象调用也可以被类本身调用
print("类方法~~")
b.class_foo("methond")
B.class_foo("methond")
# 静态方法
print("静态方法~~")
b.static_foo("method")
B.static_foo("method")
\类方法静态方法实例方法
b = B()b.class_foo(x)b.static_foo(x)b.foo(x)
BB.class_foo(x)B.static_foo(x)不可以调用

注意:

类方法: cls; @classmethod
静态方法: 无需传递self或者cls,直接传参数; @staticmethod
实例方法: self

二、静态方法使用场景

from math import sqrt
class Triangle(object):
   # 构造方法
   def __init__(self,a,b,c):
       self._a = a
       self._b = b
       self._c = c

   # 实例方法
   @staticmethod
   def is_valid(a,b,c):
       return a + b > c and b + c > a and a + c > b

   # 求周长
   def perimeter(self):
       return self._a + self._b + self._c

   # 求面积
   def area(self):
       half = self.perimeter()/2
       return sqrt(half * (half - self._a) * (half - self._b) * (half - self._c))

if Triangle.is_valid(3,4,5):
   # 先判断三边是否能构成新的三角型, 能则创建
   t = Triangle(3,4,5)
   print(t.perimeter())
   print(t.area())
else:
   print("请输入有效的边长")

三、类方法使用场景

class Dog(object):
   def __init__(self,t_w):
           self.t_w = t_w

   @classmethod
   def create_dog(cls,t_w,t_shape):
       dog = cls(t_w)
       # 动态给类添加属性
       dog.shape = t_shape
       return dog

dog1 = Dog("wwwww")
dog2 = Dog.create_dog("kkkkk","bbbbbb")

print(dog1.t_w)
print(dog2.shape)

四、动态添加方法

4.1 静态方法

class A(object):
   @staticmethod
   def sub(x,y):
       print("%s...%s"%(x,y))
       
class B(A):
   @staticmethod
   def sub(x,y):
       print("%s.!!!!!.%s"%(x,y))

@staticmethod
def ff():
   print("在讲课....")

4.2 类方法

class Person(object):
   country = "china"
   def __init__(self,name):
       self.name = name

class Stu(Person):
   def __init__(self):
       print("I am py")

@classmethod
def run(cls):
  print("%s在奔跑"%cls.country)

# 赋值
Person.run = run
# 调用
s = Stu()
s.run()

五、多态

class Ani(object):
   def run(self):
       print("Ani is running...")

class Cat(Ani):
   def run(self):
       print("Cat 用4支腿 run")

class Person(Ani):
   def run(self):
       print("Person 用2支腿 run 用两只胳膊轮")

p = Person()
p.run()
c = Cat()
c.run()

六、类的专有方法

__init__ : 构造方法 , 生成对象时调用
__del__: 解析函数, 释放对象时调用
__dict__: 字典 记录类属性信息
__len__: 获得长度
__mro__: 方法查询
__str__: 给用户看
__repr__: 给解析器看

七、高阶函数

函数: map(func, *iterables) 映射

注意面试知识点: py2.x返回是列表 ,py3.x 返回迭代器

l = [1,2,3,4,5,6]
def pow3(x):
    return x**3
l_pow3 = map(lambda x:pow(x,3),l)
print(list(l_pow3))
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页