#python是动态语言,表现在可以在程序运行过程中添加属性、方法
#添加变量
class person(object):
count=1
__index=99
def __new__(cls, *args, **kwargs):
print("这是__new__方法的自动调用,该方法返回值为类object创建的类对象或者父类创建的类对象")
return object.__new__(cls)
def __init__(self,name,age):
self.name=name
self.age=age
self.__girlfriend="莫莫"
def test(self):
print("这是实例方法test的调用")
print("实例方法可以调用实例属性和类属性")
print(self.age)
print(f"我们正在使用实例方法来调用类公开属性count,其值为:{self.count}")
print(f"我们也可以在实例方法中使用类对象来调用类公开属性count,其值为:{person.count}")
print(f"我们正在使用实例方法来调用类私有属性__index,其值为:{self.__index}")
print(f"我们在实例方法中使用类对象来调用类私有属性__index,其值为:{person.__index}")
print(f"我们正在实例方法中调用实例公开属性name,其值为:{self.name}")
print(f"我们正在实例方法中调用实例私有属性__girlfriend,其值为:{self.__girlfriend}")
#print(f"我们可以在实例方法中调用私有实例方法__test1,调用结果为:{self.__test1()}")
print("我们可以在实例方法中调用类方法,调用结果为:")
person.classmethod1()
person.__classmethod2()
def __test1(self):
print("这是实例私有方法__test1的调用")
print("实例方法可以调用实例属性和类属性")
print(f"我们正在使用实例方法来调用类公开属性count,其值为:{self.count}")
print(f"我们也可以在实例方法中使用类对象来调用类公开属性count,其值为:{person.count}")
print(f"我们正在使用实例方法来调用类私有属性__index,其值为:{self.__index}")
print(f"我们在实例方法中使用类对象来调用类私有属性__index,其值为:{person.__index}")
print(f"我们正在实例方法中调用实例公开属性name,其值为:{self.name}")
print(f"我们正在实例方法中调用实例私有属性__girlfriend,其值为:{self.__girlfriend}")
print(f"我们可以在实例方法中调用实例方法__test1,调用结果为:{self.test(self)}")
print("我们可以在实例方法中调用类方法,调用结果为:")
person.classmethod1(person)
print("调用私有类方法的结果为:")
person.__classmethod2(person)
@classmethod
def classmethod1(cls):
print("这是类方法的调用,类方法只能访问类属性,我们可以用类方法对类属性进行更改")
print(f"初始时类属性count的值为:{cls.count}")
person.count=99
print(f"更改之后的count值为{cls.count}")
print("在类方法中我们也可以调用实例方法:")
person.test(cls)
print("私有实例方法的调用结果为:")
person.__test1(person)
@classmethod
def __classmethod2(cls):
print("这是类私有方法的调用,当然我们也可以用该方法更改类属性")
print(f"更改之前的count值为:{cls.count}")
person.count=999
print(f"更改之后的count值为:{cls.count}")
print("在类方法中我们也可以调用实例方法:")
person.test(person)
print("私有实例方法的调用结果为:")
person.__test1(person)
print("我们可以在类方法中通过类对象调用静态方法")
person.staticmethod1()
print("静态私有方法的调用结果是:")
person.__staticmethod2()
@staticmethod
def staticmethod1():
print("这是静态方法的调用")
print("在静态方法中引用对象属性必须用类对象进行引用")
print(f"我们现在用类对象来调用类属性count,得出的count的值为:{person.count}(用person调用)")
print(f"在静态方法中通过类对象可以调用实例方法")
person.test()
print("私有实例方法的调用结果为:")
person.__test1()
@staticmethod
def __staticmethod2():
print("这是静态私有方法的调用")
print("在静态私有方法中也可以使用类对象来调用类属性的引用")
print(f"我们现在用类对象在静态私有方法中对类属性进行调用,其值为:{person.count}")
print(f"在静态方法中通过类对象可以调用实例方法")
person.test()
print("私有实例方法的调用结果为:")
person.__test1()
def __str__(self):
print("这是__str__方法的调用")
def __del__(self):
print("这是__del__方法的调用,其作用和C++中的析构函数一样")
#python动态语言,在运行过程中添加属性和方法
#添加属性
def add(self):
print("这是一个要添加到person类中的方法,当我们看到这句话时就完成了添加")
import types
person.add=types.MethodType(add,person)
p=person("天山童姥",99)
p.add()
@classmethod
def classmethods(cls):
print("这是一个类方法,我们将要把这个类方法添加到person类中去")
person.classmethods=classmethods
p.classmethods()
@staticmethod
def teststaticmethod():
print("这是一个静态方法,我们成功的将该方法添加到了person类中")
person.teststaticmethod=teststaticmethod
p.teststaticmethod()