python基础-类

实例属性和类属性

类中,没有self指定的是类属性,有self指定的是实例属性。类中的方法是类属性。
类和实例都是名字空间。类是类属性的名字空间,实例时实例属性的名字空间。
可以通过类访问类属性,通过实例访问实例属性。如果实例没有同名属性的话,也可以通过实例访问类属性。
比如类C,有version属性,可以通过类访问:C.version。创建实例c后,实际上访问c.version会失败,但是,会首先在实例中搜索version,然后在类中搜索,再到继承树中的基类。

访问类属性

class C(object):
	version = 1.2  # 类属性
c=C()
C.version  # 通过类访问类属性
c.version # 通过实例访问类属性

类属性为不可变对象,通过实例访问类属性

C.version += 1  # 通过类更改类属性
c.version = 1 # 不能通过实例更改类属性,这样会创建一个实例属性
c.version += 1 # 为2.2,以类属性的值创建实例属性,等于c.version = C.version + 1

类属性为可变对象,通过实例访问类属性

class Foo(object):
	x=

foo = Foo()
foo.x  # {2003:'poe2'}

foo.x[2004] = 'valid path'
foo.x  # {2003:'poe2', 2004:'valid path'}

Foo.x  # {2003:'poe2', 2004:'valid path'}  通过实例修改了类属性

del foo.x # 失败

类属性持久化

通过实例属性类修改类属性很危险。
类属性是静态成员,类属性的修改会影响所有实例。

绑定和方法调用

方法是类内部定义的函数,方法是类属性不是实例属性。绑定主要与方法调用有关。
方法只有在类拥有实例时,才能被调用。存在一个实例时,方法才认为是绑定到哪个实例,没有实例时就是未绑定的。
方法有self参数,用于引用方法所绑定的实例。
调用绑定方法
有一个MyClass类,带self参数的foo方法,实例mc。通过实例调用方法就是调用绑定方法,mc.foo()。
调用非绑定方法
调用一个还没有任何实例的类中的方法,也就是通过类调用类方法。需要明确的传递self参数。场景:派生一个子类,并且覆盖父类的方法,需要调用父类中的方法。

class SubClass(FatherClass):
	def __init__(self, nm,ph):
		FatherClass.__init__(self,nm)
		self.ph = ph

静态方法和类方法

python静态方法特性之前,通过在全局名字空间创建函数替代。
通常方法需要self参数,绑定方法调用时,自动传递。对于类方法,需要的是类,通常名为cls,自动传递给类方法。

staticmethod()和classmethod()内建函数

经典类中使用静态方法和类方法

class TestStaticMethod:
	def foo():
		print 'calling static method foo()'
	foo = staticmethod(foo)

class TestClassMethod:
	def foo(cls):
		print 'calling class method foo()'
	foo = classmethod(foo)

tsm = TestStaticMethod()
TestStaticMethod.foo() # 通过类调用
tsm.foo()  # 通过实例调用
tcm = TestClassMethod()
TestClassMethod.foo()  #  通过类调用
tcm.foo()  #通过实例调用

使用函数修饰符

class TestStaticMethod:
	@staticmethod
	def foo():
		print 'calling static method foo()'
class TestClassMethod:
	@classmethod
	def foo(cls):
		print 'calling class method foo()'

组合

大的类包含其他小类的实例,类之间显著不同,小类是大的类所需要的组件。

class P:
	'P class'
	def __init__(self):
		print 'created an instance of ', self.__class__.__name__
class C(P):
	pass

p=P() # 父类实例
p.__class__
P.__bases__
p.__doc__

c = C()
c.__class__
C.__bases__
C.__doc__  #文档字符串不能继承父类 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值