python class
from abc import ABC
#ABC为一个抽象基类 等我理解了一定加上为什么用这个抽象基类的解释
class Test(ABC):
def __init__(self): #类方法
self.a = 1 #类实例变量
_a = 10 #类成员变量
__b = 5 #当类成员变量或方法前加__的话表示只能在类内使用
def private_test(self):
print(self.__b)
@classmethod
def public_test(cls):
print(cls._a)
print(Test._a)
#我们一般推荐用类名来访问成员变量
#这是因为改写类成员变量时 所有对象访问该成员变量时的值也会被修改
Test.public_test()
t = Test() # Test是类,t是该类的一个对象
print(t.a) #只有将类实例化才可以访问类实例变量
t.private_test()
@property
Python 类变量装饰器
类的成员变量在类外不通过类型检查直接赋值是一件很危险的事情,所以最好是加上get set函数和__,然后set时加上类型检查就好了
from abc import ABC
class Student(ABC):
def __init__(self):
self._value = 10
def get_value(self):
return self._value
def set_value(self, value):
if isinstance(value, int):
self._value = value
s = Student()
s.set_value(60)
print(s.get_value())
但是这样就很麻烦
于是 我们可以用@property装饰器来优化一下代码
from abc import ABC
class Student(ABC):
def __init__(self):
self._value = 10
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if isinstance(value, int):
self._value = value
# Test.a = 'str' 这就很危险了
s = Student()
s.value = 60
print(s.value)
当然可以不写set函数 这样该变量就成为了一个只读变量