Skip to content

Commit b9f71ac

Browse files
committed
property
property
1 parent 7cb475b commit b9f71ac

File tree

4 files changed

+63
-14
lines changed

4 files changed

+63
-14
lines changed

python_advance/Python中的下划线.md

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,29 @@
22
#### 单下划线
33
* _XXX: “单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入.
44

5+
**@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。**
6+
57
```python
6-
class Person(object):
7-
def __init__(self,name,age):
8-
self.name = name
9-
self._age = age
10-
def play(self):
11-
print(self.name,self._age)
12-
def main():
13-
p = Person('王大锤',12)
14-
p.play()
8+
class Person(object):
9+
def __init__(self,name,age):
10+
self.name = name
11+
self._age = age
12+
13+
@property
14+
def age(self):
15+
return self._age
16+
17+
if __name__ == '__main__':
18+
p = Person('王大锤', 12)
1519
"""
1620
'单下划线'的保护变量
1721
大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,
1822
本类之外的代码在访问这样的属性时应该要保持慎重。
1923
这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻
20-
"""
21-
print(p._age)
22-
23-
if __name__ == '__main__':
24-
main()
24+
"""
25+
print(p._age)
26+
# 通过定义的接口访问保护变量
27+
print(p.age)
2528
```
2629
#### 双下划线
2730
* \_\_XXX: “双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。通过对象名._类名__xxx这样的方式可以访问.

python_basic/main.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,5 @@
2323
* [匿名函数,列表推导式,字典推导式,生成器表达式,map,filter,reduce](列表推导式.md)
2424
* [== 与 is的区别](is.md)
2525
* [python异常处理机制](python异常处理机制.md)
26+
* [\_\_new__()与\_\_init__()方法](new和init方法.md)
27+
* [@property 保护变量的访问与设置](保护变量的访问与设置.md)

python_basic/new和init方法.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# \_\_new__()和\_\_init__()方法
2+
* \_\_new__():是类的构造方法,在实例创建前被调用,它的作用就是创建实例并返回实例对象,是一个静态方法
3+
* \_\_init__():是类的初始化方法,当实例对象被创建后调用,然后初始化实例对象的属性值,是一个实例方法
4+
* new()方法先被调用,创建实例对象,然后将实例对象传递给init()方法的self,进行初始化操作
5+
6+
## \_\_new__()实现单例
7+
```python
8+
class Singleton:
9+
def __new__(cls, *args, **kwargs):
10+
if not hasattr(cls, 'instance'):
11+
cls.instance = super().__new__(cls)
12+
return cls.instance
13+
14+
15+
if __name__ == '__main__':
16+
s1 = Singleton()
17+
s2 = Singleton()
18+
print(s1 is s2) # True
19+
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 保护变量的访问与设置
2+
对于私有变量(双下划线)或者保护变量(单下划线),不允许外部直接访问,类似于Java的private,可以通过对外提供get,set接口来访问和修改这类变量,便于控制。
3+
4+
* @property装饰器会将方法转换为相同名称的只读属性,相当于实现get方法
5+
* @xxx.setter装饰器使得可以直接通过 对象.xxx来修改保护变量的值,相当于实现set方法
6+
7+
```python
8+
class Student(object):
9+
def __init__(self, name):
10+
self.name = name
11+
self._score = None
12+
13+
@property
14+
def score(self):
15+
return self._score
16+
17+
@score.setter
18+
def score(self, value):
19+
self._score = value
20+
21+
if __name__ == '__main__':
22+
s = Student('王大锤')
23+
s.score = 100 # 设置保护变量的值
24+
print(s.score) # 访问保护变量
25+
```

0 commit comments

Comments
 (0)