函数(function)
普通的 def 即函数,也就是不与类或类的实例相关。术语上被称为“非绑定”函数
def say():
print('hello world')
方法(method)
与对象属性相关联的函数即方法
也就是说 方法是在类中定义的函数,或是类方法 @classmethod
修饰 、实例方法以 instance.method()示意
、静态方法 @staticmethod
修饰
- 静态方法没有slef, 类方法第一个参数为cls,实例方法第一个参数为self
- 静态方法无法访问类变量和成员变量
- 类方法无法访问成员变量
```python
类方法
class A: @classmethod def clsmethod(cls, para)cls.paras = para
print(cls.paras)
调用方式
A.clsmethod()
实例方法
class B: a = [1, 2, 3] b = [2, 5]
def instance_method(self, a=a, b=b):
self.a = a
self.b = b
for i in a:
if i in b:
print(i)
调用方式
st = B() st.instance_method()
静态方法
class C: @staticmethod def static_method(): print(‘c’)
调用方式
C.static_method()
<a name="znmZh"></a>
###
<a name="mTNzX"></a>
### [函数注解](https://docs.python.org/zh-cn/3.9/tutorial/controlflow.html#function-annotations)(Py3.5及以上)
```python
# "冒号+类型" 即限定参数类型
def call_sth(para :str):
print("para must be strings")
return
# "->"+类型 即限定返回值类型
def invoke_sth(para :str) -> str:
return "hello" + para
# "#"+空格+"type: "+类型 即限定返回值类型
def find_elements(self, locator, value, timeout=10):
try:
# 解决 IDE 无法判断 < el > 对象的类型,避免导致引用方法时 IDE 无提示问题(实际可调用)而加入类型注解
el = WebDriverWait(self.driver, timeout).until(
lambda driver: driver.find_elements(by=locator, value=value)) # type: WebElement
self.driver.execute_script("arguments[0].setAttribute('style', arguments[1]);", el, _HIGH_LIGHT)
return el
except (AttributeError, Exception):
属性(property)
property() 函数
属性用 property() 函数
调用函数property时,还可不指定参数、指定一个参数、指定三个参数或指定四个参数。 如果没有指定任何参数,创建的特性将既不可读也不可写。如果只指定一个参数(获取方法),创建的特性将是只读的。第三个参数是可选的,指定用于删除属性的方法(这个方法不接受任何参数)。第四个参数也是可选的,指定一个文档字符串。这些参数分别名为fget、fset、fdel和doc。如果你要创建一个只可写且带文档字符串的特性,可使用它们作为关键字参数来实现。 property其实并不是函数,而是一个类。它的实例包含一些魔法方法,而所有的魔法都 是由这些方法完成的。这些魔法方法为get、set和delete,它们一道定义了所谓的描述符协议。只要对象实现了这些方法中的任何一个,它就是一个描述符。描述符的独特之处在于其访问方式。
Python中的术语“属性”(property),与其他语言如Java成员属性(如成员方法、成员变量)不同,它是指的对某 attribute 的 setter、getter 等进行包装,返回一个新的 attribute。
- 属性拦截
- getattribute(self, name):在属性被访问时自动调用
- getattr(self, name):在属性被访问而对象没有这样的属性时自动调用
- setattr(self, name, value):试图给属性赋值时自动调用
- delattr(self, name):试图删除属性时自动调用
@property 装饰器
@property
装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。在调用时,只需要使用其名称(即去掉()
)即可
官方摘要
class Person:
def __init__(self):
self._name = 'owner'
# def set_name(self, name): self.name = name
# def get_name(self): return self.name
@property
def name(self):
# print(self._name)
return self._name
@name.setter
def name(self, val):
self._name = val
def say(self):
print('hello, %s' % self.name)
if __name__ == '__main__':
p = Person()
p.name = 'hailong'
p.say()
测试:当将上述的属性 name setter
注释后, IDE 出现提示、运行时将报错