概述
本篇记录一下Python类的成员、成员修饰符、类的特殊成员
类的成员字段
方法
属性
普通字段保存在对象所在的内存空间中,对象拷贝静态字段到自己的内存空间,其他成员都在类的内存空间,使用时再调取。
1,字段普通字段属于对象
静态字段属于类,对象只是拷贝静态字段,修改不影响静态字段原来的值,和Java不同
class fathclass:
name = 'njcx'
def __init__(self,age):
self.age=age
def getName(self):
return self.age
print fathclass.name
day = fathclass(18)
print day.name
day.name = 'oldnjcx'
#修改对象name
print day.name
print fathclass.name
#原来的name并没有发生改变
fathclass.name = 'youngnjcx'
#通过类修改静态字段并不影响对象的静态字段
print day.name
print fathclass.name
2,方法普通方法 由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
静态方法 由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
类方法 由类调用;无默认参数;
其中,静态方法通过@staticmethod修饰,类方法通过@classmethod修饰, 下面列举一些类方法用在模拟java定义多个构造函数的情况。 由于python类中只能有一个初始化方法,不能按照不同的情况初始化类
# coding:utf-8
class Book(object):
def __init__(self, title):
self.title = title
@classmethod
def create(cls, title):
book = cls(title=title)
return book
book1 = Book("python")
book2 = Book.create("python and django")
print book1.title
print book2.title静态方法调用另一个静态方法,如果改用类方法调用静态方法,可以让cls代替类, 让代码看起来精简一些。也防止类名修改了,不用在类定义中修改原来的类名
# coding:utf-8
class Foo(object):
X = 1
Y = 2
@staticmethod
def averag(*mixes):
return sum(mixes) / len(mixes)
@staticmethod
def static_method():
return Foo.averag(Foo.X, Foo.Y)
@classmethod
def class_method(cls):
return cls.averag(cls.X, cls.Y)
foo = Foo()
print foo.static_method()
print foo.class_method()继承类中的区别 从下面代码可以看出,如果子类继承父类的方法,子类覆盖了父类的静态方法, 子类的实例继承了父类的static_method静态方法,调用该方法,还是调用的父类的方法和类属性。 子类的实例继承了父类的class_method类方法,调用该方法,调用的是子类的方法和子类的类属性。
# coding:utf-8
class Foo(object):
X = 1
Y = 2
@staticmethod
def averag(*mixes):
return sum(mixes) / len(mixes)
@staticmethod
def static_method():
return Foo.averag(Foo.X, Foo.Y)
@classmethod
def class_method(cls):
return cls.averag(cls.X, cls.Y)
class Son(Foo):
X = 3
Y = 5
@staticmethod
def averag(*mixes):
return sum(mixes) / 3
p = Son()
print p.static_method()
print p.class_method()
3,属性Python中的属性其实是普通方法,方法当做属性访问
基本使用和两种定义方式
1,属性的基本使用定义时,在普通方法的基础上添加 @property 装饰器;
定义时,属性仅有一个self参数
调用时,无需括号
class fathclass:
name = 'njcx'
def __init__(self,age):
self.age=age
def getName(self):
return self.age
@property
def grade(self):
return 'six'
son = fathclass(16)
print son.grade
一般 做动态属性,才用到@property
2、属性的两种定义方式装饰器 即:在方法上应用装饰器
静态字段 即:在类中定义值为property对象的静态字段
其中装饰器又分经典类和新式类,经典类仅仅支持@property,新式类支持@方法名.setter,@方法名.deleter经典类
class fathclass:
name = 'njcx'
def __init__(self,age):
self.age=age
def getName(self):
return self.age
def age(self):
return self.age
@property
def grade(self):
return 'six'
# 装饰器
aGe = property(age)
#property对象
son = fathclass(16)
print son.grade
print son.aGe新式类
class fathclass(object):
name = 'njcx'
def __init__(self,age):
self.age=age
def getName(self):
return self.age
def age(self):
return self.age
@property
def grade(self):
return 'six'
@grade.setter
def grade(self,ge):
print '@price.setter'+ge
@grade.deleter
def grade(self):
print '@price.setter'
# 装饰器
aGe = property(age)
#property对象
son = fathclass(16)
print son.grade
son.grade = 'five'
del son.grade
静态字段
property的构造方法中有个四个参数第一个参数是方法名,调用 对象.属性 时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
第四个参数是字符串,调用 对象.属性.doc ,此参数是该属性的描述信息
class Foo:
def get_bar(self):
return 'njcx'
def set_bar(self, value):
return 'set value' + value
def del_bar(self):
return 'njcx'
BAR = property(get_bar, set_bar, del_bar, 'description...')
obj = Foo()
print obj.BAR
obj.BAR = "alex"
del Foo.BAR
obj.BAR.__doc__
最后
以上就是忐忑西装为你收集整理的python采用面向对象编程模式吗_Python面向对象编程(B篇)的全部内容,希望文章能够帮你解决python采用面向对象编程模式吗_Python面向对象编程(B篇)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复