PCB是指暗藏第一类的特性和同时实现技术细节,仅对内提供更多公用出访形式。
他们面向对象崇尚“高contained,低谐振”
高contained:类的内部统计数据操作形式技术细节他们顺利完成,不容许内部干预
低谐振:仅对内曝露小量的形式用作采用。
暗藏第一类内部的繁杂性,只对内申明单纯的USB。易于外间初始化,进而提升控制系统的扩展性、可移植性。浅显的说,把该暗藏的暗藏出来,该曝露的曝露岀来。这是PCB性的结构设计价值观。
专有特性
在class内部,能有特性和形式,而内部标识符能透过间接初始化示例表达式的形式来操作形式统计数据,这种,就暗藏了内部的繁杂方法论。但,从后面Student类的表述上看,内部标识符却是能民主自由地修正两个示例的name、score特性:
class Student(object):
def init(self, name, score):
self.name = name
self.score = score
alvin=Student(“alvin”,66)
yuan=Student(“yuan”,88)
alvin.score=100
print(alvin.score)
假如要让内部特性不被内部出访,能把特性的中文名称前加之三个换行,在Python中,示例的cp如果以开头,就变成了两个专有表达式(private),只有内部能出访,内部不能出访,所以,他们把Student类改一改:
class Student(object):
def init(self, name, score):
self.name = name
self.score = score
alvin = Student(“alvin”,66)
yuan = Student(“yuan”,88)
print(alvin.score)
改完后,对于内部标识符来说,没什么变动,但已经无法从内部出访示例表达式.name和示例表达式.score。
这种就确保了内部标识符不能随意修正第一类内部的状态,这种透过出访限制的保护,标识符更加健壮。
class Student(object):
def init(self, name, score):
self.name = name
self.score = score
def getscore(self):
return self.score
alvin=Student(“alvin”,66)
yuan=Student(“yuan”,88)
print(alvin.getscore())
假如又要容许内部标识符修正age怎么办?能再给Student类增加setscore形式:
class Student(object):
def init(self, name, score):
self.name = name
self.score = score
def getscore(self):
return self.score
def setscore(self,score):
self.score = score
alvin=Student(“alvin”,12)
print(alvin.getscore())
alvin.setscore(100)
print(alvin.getscore())
你也许会问,原先那种间接透过alvin.score =100也能修正啊,为什么要表述两个形式大费周折?因为在形式中,能设置值时做其他操作形式,比如记录操作形式日志,对参数做检查,避免传入无效的参数等等:
class Student(object):
def setscore(self,score):
if isinstance(score,int) and 0<= score <=100:
self.score = score
else:
raise ValueError(error!)
注意
1、这种机制也并没有真正意义上限制他们从内部间接出访特性,知道了类名和特性名就能拼出名字:
类名特性,然后就能出访了,如a.AN
2、变形的过程只在类的内部生效,在表述后的赋值操作形式,不会变形
class Student(object):
def init(self, name, score):
self.name = name
self.score = score
def getscore(self):
return self.score
yuan=Student(“yuan”,66)
print(yuan.dict)
yuan.age=18
print(yuan.dict)
4、单换行、双换行、头尾双换行说明:
foo:表述的是特殊方法,一般是控制系统表述名字,类似 init()之类的。
foo:以单换行开头的表示的是 protected 类型的表达式,即保护类型只能容许其本身与子类进行出访。(约定成俗,不限语法)
foo:双换行的表示的是专有类型(private)的表达式,只能是容许这个类本身进行出访了。
class Person(object):
def init(self, name, score):
self.name = name
self.score = score
class Student(Person):
def getscore(self):
return self.score
def setscore(self,score):
self.score=score
yuan=Student(“yuan”,66)
print(yuan.dict)
print(yuan.getscore())
专有形式
在继承中,父类假如不想让子类覆盖他们的形式,能将形式表述为专有的:
class Base:
def foo(self):
print(“foo from Base”)
def test(self):
self.foo()
class Son(Base):
def foo(self):
print(“foo from Son”)
s=Son()
s.test()
class Base:
def foo(self):
print(“foo from Base”)
def test(self):
self.foo()
class Son(Base):
def foo(self):
print(“foo from Son”)
s=Son()
s.test()
property特性装饰器
class Student(object):
def init(self,name,score,sex):
self.name = name
self.score = score
self.sex = sex
@property
def name(self):
return self.name
@name.setter
def name(self,name):
if len(name)>1 :
self.name = name
else:
print(“name的长度必须要大于1个长度”)
@property
def score(self):
return self.score
#@score.setter
# def score(self, score):
# if score >0 and score <100:
# self.score = score
# else:
# print(“输入错误!”)
yuan = Student(yuan,18,male)
yuan.name =苑昊# 初始化了score(self, score)函数设置统计数据
yuan.score =199
print(yuan.score)
注意,采用@property 装饰器时,USB名不必与特性名相同。
python提供更多了更加人性化的操作形式,能透过限制形式顺利完成只读、只写、读写、删除等各种操作形式
class Person:
def init(self, name):
self.name = name
def getname(self):
return self.name
def setname(self, name):
self.name = name
def delname(self):
del self.name
# property()中表述了读取、赋值、删除的操作形式
# name = property(getname, setname, delname)
name = property(getname, setname)
yuan = Person(“yuan”)
print(yuan.name)# 合法:调用getname
yuan.name =”苑昊”# 合法:初始化setname
print(yuan.name)
# property中没有添加delname函数,所以不能删除指定的特性
del p.name #错误:AttributeError: cant delete Attribute
@property广泛应用在类的表述中,能让初始化者写出简短的标识符,同时保证对参数进行必要的检查,这种,程序运行时就减少了出错的可能性。