- Reference:《Python程序设计基础(第2版)》
- Reference:《Python中的装饰器》https://www.jianshu.com/p/417ac7d95db9
#面向对象,基础类
#cls 用于定义类方法,self 用于定义实例方法
class Car(object):
def infor(self):
print("This is a Cat!")
Irish_Moonshine = Car() #实例化一个对象
Irish_Moonshine.infor()
flag = isinstance(Irish_Moonshine, Car)#测试前者对象是否属于后者
print(flag)
flag = isinstance(Irish_Moonshine, str)
print(flag)
TypeI = type(Irish_Moonshine) #查看类型type
print(TypeI)
#私有对象,如果成员名以两个(或更多)下划线开头但是并不以两个(或更多)
#下划线结尾的成员变量,为私有成员!
#但Python并没有为私有成员提供严格的访问保护机制
class A:
def __init__(self, value1 = 0, value2 = 0): #成员方法
self.value1 = value1 #public
self.value2 = value2 #public
def setValue(self, value1, value2):
self._value1 = value1 #protected 保护对象,只有类对象和子类对象可以访问
self.__value2 = value2 #private 私有对象
def show(self):
print(self._value1)
print(self.__value2)
Wnqq = A() #实例化对象
print(Wnqq.value1)
#0
print(Wnqq.value2)
#0
print(dir(Wnqq))#查看Wnqq的所有公开成员
#['__class__', '__delattr__', '__dict__',
#'__dir__', '__doc__', '__eq__', '__format__',
#'__ge__', '__getattribute__', '__gt__', '__hash__',
#'__init__', '__init_subclass__', '__le__', '__lt__',
#'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
#'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
#'__weakref__', 'setValue', 'show', 'value1', 'value2']
#print(Wnqq._value1) ERROR: 'A' object has no attribute '_value1'
#print(Wnqq.__value2) ERROR: 'A' object has no attribute '__value2'
#__xx__ :系统定义的特殊成员
#对象的数据成员一般在__init__中定义
class Demo(object):
total = 0
def __new__(cls, *args, **lwargs):
if cls.total >=3:
raise Exception('最多只创建3个对象')
else:
return object.__new__(cls)
def __init__(self):
Demo.total = Demo.total + 1
data1 = Demo()
data2 = Demo()
data3 = Demo()
#data4 = Demo() #Exception: 最多只创建3个对象
class zzTest:
def __init__(self, *args, **kwargs):
print("init")
print(self)
@classmethod #如果有此句子,cls只是类;否则cls和self一样是实例化对象
#classmethod:Python装饰器类函数,属于整个类,类似于C++/JAVA中的静态函数。
#类方法有类变量cls传入,从而可以用cls做一些相关的处理。
#子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
#既可以在类内部使用self访问,也可以通过实例、类名访问。
#即在类的函数前加@classmethod属性,函数第一个参数为cls类,
#表示该函数是类的方法,而不需要绑定具体实例。
#在类方法里面可以调用类的属性,并且在类调用该函数时,
#会将自身作为第一个参数传入,类方法不能访问实例。实例可以调用类方法。
#使用@staticmethod或@classmethod,
#就可以不需要实例化,直接类名.方法名()来调用。
#这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,
#同时有利于命名空间的整洁。
#Reference:https://www.jianshu.com/p/417ac7d95db9
def Wnqq(cls):
print("cls")
print(cls)
test = zzTest()
test.Wnqq()
#init
#<__main__.zzTest object at 0x00000235F8A32D30>
#cls
#<class '__main__.zzTest'>
print(test.__class__)
#<class '__main__.zzTest'>
zzTest().Wnqq() #因为@classmethod,所以可以不用实例化直接访问Wnqq()方法
#cls
#<class '__main__.zzTest'>