标签:static 参数 people ddb UNC python str 传值 ast
目录
封装就是把东西放在一起然后封起来,别人就拿不到了
在python中用双下划线的方式实现隐藏属性(设置成私有的)
类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:
class A:
__count = 0
def __init__(self,name):
self.name = name
def __f1(self):
print('from A.__f1')
A.__count += 1
print(A.__count)
def bar(self):
self.__f1()
a = A('hades')
print(a.__count) # 报错,拿不到__count,这是封装在类内部,外部不能调用
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-59-3b81c13cf856> in <module>
15
16 a = A('hades')
---> 17 print(a.__count) # 报错,拿不到__count,这是封装在类内部,外部不能调用
18
AttributeError: 'A' object has no attribute '__count'
a.bar() # 这是在类内部进行操作,才可以拿到
from A.__f1
1
这种变形需要注意的是:
实例化对象名._类名__属性名
进行访问a._A__count += 10 # 此时的_A__count是对象a的属性,相当于a._A_count = a._A__count + 10
# 此时等号后面的a._A__count会先去a这个对象进行查找_A__count,找不到就去类里面找,找到了就进行运算
print(a.__dict__)
print(a._A__count)
{'name': 'hades', '_A__count': 11}
11
a._A__f1() # 这个访问的是A._A__count
from A.__f1
2
同样的,我们模块也是有私有属性的,也是通过加下划线的方式进行封装,但只是一个下划线
# m1.py
_X = 10
y = 20
# m2.py
from m1 import *
print(y) # 20
print(_X) 进行报错
from m1 import _X
print(_X) # 10
注意:这种只适合类内部除了self参数外没有其他参数的函数
class Foo:
def func(self):
print('from func')
@property
def pro(self):
print('from pro')
f = Foo()
f.func() # 正常调用类的方法
f.pro # 将类的方法当成属性使用
from func
from pro
property属性的定义和调用要注意一下几点:
定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
调用时,无需括号
经典类只具有@property这一种方法
新式类中具有@property,@方法名.setter,@方法名.deleter这三种方法
class Goods:
def __init__(self, name):
self.name = name
self.goods_price = 125
@property
def price(self):
print(self.goods_price)
@price.setter
def price(self, value):
self.goods_price = value
print('from good_price')
return self.goods_price
@price.deleter
def price(self):
del self.goods_price
obj = Goods('clothes')
print(obj.__dict__)
obj.price # 自动调用@property装饰的函数
obj.price = 250 # 自动调用@price.setter装饰的函数
obj.price
del obj.price # 自动调用@price.deleter装饰的函数
print(obj.__dict__)
{'name': 'clothes', 'goods_price': 125}
125
from good_price
250
{'name': 'clothes'}
在类中,没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制
class People:
country = 'china'
def __init__(self, name, age):
self.name = name
self.age = age
def discribe(self):
print(f'{self.name} is {self.age} years old')
p = People('hades',27)
p.discribe() # 通过对象进行调用
hades is 27 years old
discribe即为对象的绑定方法,这个方法不在对象的名称空间,而是在类的名称空间中
People.discribe(p) # 通过类进行调用,就需要把对象传进去
hades is 27 years old
class A:
count = 1
@classmethod
def f1(cls,obj):
print(cls.count)
cls.f2(obj)
def f2(self):
print(self,'from f2')
a = A()
A.f1(a)
1
<__main__.A object at 0x0000024E75EDDBA8> from f2
a.f1(a)
1
<__main__.A object at 0x0000024E75EDDBA8> from f2
class A:
count = 1
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def f1(cls,obj):
print(cls.count)
cls.f2(obj)
@staticmethod
def f2(self):
print(self,'from f2')
a = A('hades',27)
A.f2(a)
a.f2() # 报错,因为没有进行传参,也就证明了这个方法不是对象的绑定方法
<__main__.A object at 0x0000024E760BD198> from f2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-96-632f4a11ba55> in <module>
19
20 A.f2(a)
---> 21 a.f2() # 报错,因为没有进行传参,也就证明了这个方法不是对象的绑定方法
TypeError: f2() missing 1 required positional argument: 'self'
标签:static 参数 people ddb UNC python str 传值 ast
原文地址:https://www.cnblogs.com/Hades123/p/11066773.html