代码改变世界

第二十六章 类代码编写基础

2017-04-19 20:32  szn好色仙人  阅读(107)  评论(0编辑  收藏  举报
#1.
#A:类对象提供默认行为,是实例对象的工厂。实例对象时程序处理的实际对象,每次调用一个类就会产生这个类新的实例
#B:执行class语句就会得到类对象
#  class语句创建类对象并将其赋值给变量名。就像函数的def一样
#  class语句内的顶层赋值语句会产生类的属性

#2.
#A:在方法内对self属性做赋值运算会产生每个实例自己的属性
#  在类方法函数内,第一个参数一般为self,会引用正处理的实例对象,对self的属性做赋值运算,会改变或创建实例内的数据,而非类的数据
#  第一个参数其名称可以是任意的,一般设为self
#B:在类外,则可以通过对实例对象进行赋值运算来产生属性
class CTest:
    def Fun0(self):
        self.value = 10
    def Fun1(self):                 #若在类的实例调用Fun0前调用此函数,会出错
        return self.value

Test = CTest()
bValue0 = 'value' in dir(Test)      #bValue0 = False
Test.Fun0()
bValue1 = 'value' in dir(Test)      #bValue1 = True

bValue2 = 'TestValue' in dir(Test)  #bValue2 = False
Test.TestValue = 'a' 
bValue3 = 'TestValue' in dir(Test)  #bValue3 = True
bValue4 = 'TestValue' in dir(CTest) #bValue4 = False

#3.
#A:父类列在了类开头的括号中
#B:__init__方法,称为类的构造函数方法,它是用于初始化对象的状态的
class CFather:
    def __init__(self):
        self.value = 'CFather'

class CChild(CFather):
    def Fun0(self):
        return self.value
Test = CChild()
value = Test.Fun0()                 #value = 'CFather'

#4.重载运算符的主要概念:
#A:以双下划线命名的方法(__X__)是特殊钩子。python运算符重载的实现是提供特殊命名方法来拦截运算。
#  python替每种运算和特殊命名的方法之间,建立了固定不变的映射关系
#B:当实例出现在内置运算时,这类方法会自动调用。
#  例如,如果实例对象继承了__add__方法,当对象出现在+表达式内时,该方法会自动调用,该方法的返回值会变成相应表达式的结果
#C:运算符覆盖方法没有默认值,也不需要
class CTest:
    def __init__(self):
        self.value = 10
    def __add__(self, value):
        return self.value + value
    def __str__(self):              #通过内置函数str或者print的时候会自动调用
        return 'str'
Test = CTest()
value = Test + 20                   #value = 30
#value1 = 20 + Test                 #报错
print(Test)                         #输出str
str = str(Test)                     #str = 'str'

#5.
#A:直接给类添加属性
class CTest : pass
Test = CTest()                      #这个类的实例开始是一个空的命名空间对象,因为她知道创建她的类,所以她会得到附加在类上的属性
CTest.value0 = 'a'
CTest.value1 = 'b'
vlaue0 = CTest.value0               #vlaue0 = 'a'
value1 = Test.value1                #value1 = 'b'

def Fun0(T):
    T.value0 = 'c'
CTest.Fun0 = Fun0
Test.Fun0()
value = Test.value0                 #value = 'c'