函数(function)

普通的 def 即函数,也就是不与类或类的实例相关。术语上被称为“非绑定”函数

  1. def say():
  2. print('hello world')

方法(method)

与对象属性相关联的函数即方法

也就是说 方法是在类中定义的函数,或是类方法 @classmethod 修饰 、实例方法以 instance.method()示意、静态方法 @staticmethod 修饰

  • 静态方法没有slef, 类方法第一个参数为cls,实例方法第一个参数为self
  • 静态方法无法访问类变量和成员变量
  • 类方法无法访问成员变量 ```python

    类方法

    class A: @classmethod def clsmethod(cls, para)
    1. cls.paras = para
    2. print(cls.paras)

调用方式

A.clsmethod()

实例方法

class B: a = [1, 2, 3] b = [2, 5]

  1. def instance_method(self, a=a, b=b):
  2. self.a = a
  3. self.b = b
  4. for i in a:
  5. if i in b:
  6. print(i)

调用方式

st = B() st.instance_method()

静态方法

class C: @staticmethod def static_method(): print(‘c’)

调用方式

C.static_method()

  1. <a name="znmZh"></a>
  2. ###
  3. <a name="mTNzX"></a>
  4. ### [函数注解](https://docs.python.org/zh-cn/3.9/tutorial/controlflow.html#function-annotations)(Py3.5及以上)
  5. ```python
  6. # "冒号+类型" 即限定参数类型
  7. def call_sth(para :str):
  8. print("para must be strings")
  9. return
  10. # "->"+类型 即限定返回值类型
  11. def invoke_sth(para :str) -> str:
  12. return "hello" + para
  13. # "#"+空格+"type: "+类型 即限定返回值类型
  14. def find_elements(self, locator, value, timeout=10):
  15. try:
  16. # 解决 IDE 无法判断 < el > 对象的类型,避免导致引用方法时 IDE 无提示问题(实际可调用)而加入类型注解
  17. el = WebDriverWait(self.driver, timeout).until(
  18. lambda driver: driver.find_elements(by=locator, value=value)) # type: WebElement
  19. self.driver.execute_script("arguments[0].setAttribute('style', arguments[1]);", el, _HIGH_LIGHT)
  20. return el
  21. except (AttributeError, Exception):

属性(property)

property() 函数

属性用 property() 函数

调用函数property时,还可不指定参数、指定一个参数、指定三个参数或指定四个参数。 如果没有指定任何参数,创建的特性将既不可读也不可写。如果只指定一个参数(获取方法),创建的特性将是只读的。第三个参数是可选的,指定用于删除属性的方法(这个方法不接受任何参数)。第四个参数也是可选的,指定一个文档字符串。这些参数分别名为fget、fset、fdel和doc。如果你要创建一个只可写且带文档字符串的特性,可使用它们作为关键字参数来实现。 property其实并不是函数,而是一个类。它的实例包含一些魔法方法,而所有的魔法都 是由这些方法完成的。这些魔法方法为getsetdelete,它们一道定义了所谓的描述符协议。只要对象实现了这些方法中的任何一个,它就是一个描述符。描述符的独特之处在于其访问方式。

Python中的术语“属性”(property),与其他语言如Java成员属性(如成员方法、成员变量)不同,它是指的对某 attribute 的 setter、getter 等进行包装,返回一个新的 attribute。

  • 属性拦截
    • getattribute(self, name):在属性被访问时自动调用
    • getattr(self, name):在属性被访问而对象没有这样的属性时自动调用
    • setattr(self, name, value):试图给属性赋值时自动调用
    • delattr(self, name):试图删除属性时自动调用

@property 装饰器

@property 装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。在调用时,只需要使用其名称(即去掉 () )即可

官方摘要
image.png

  1. class Person:
  2. def __init__(self):
  3. self._name = 'owner'
  4. # def set_name(self, name): self.name = name
  5. # def get_name(self): return self.name
  6. @property
  7. def name(self):
  8. # print(self._name)
  9. return self._name
  10. @name.setter
  11. def name(self, val):
  12. self._name = val
  13. def say(self):
  14. print('hello, %s' % self.name)
  15. if __name__ == '__main__':
  16. p = Person()
  17. p.name = 'hailong'
  18. p.say()

测试:当将上述的属性 name setter注释后, IDE 出现提示、运行时将报错
image.png