浅谈Python类的属性和方法
在python中,有私有属性和公有属性,方法我们也一样,他们之间有何区别?
还有类属性和实例属性又是怎么回事?
静态方法和类方法又有什么区别?
我们在工作过程中,可能不太清楚,为什么要有私有属性,他们的意义何在?
我们对类的继承,对方法的重写又有哪些要注意的?
本着这些东西既然被设计出来了,就是为了我们更高效的工作这一角度,下面我从工作的角度,简单的说一下,这些点的区别:
xx
: 公有变量
_x
: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问,也就是继承和调用
__xx
:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到),既不能继承也不可以调用
__xx__
:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
xx_
:单后置下划线,用于避免与Python关键词的冲突
我们在继承的时候什么继承不了,什么时候调用不了?
__xxx
属性和方法都不可以继承及调用,但是类中其他类型的方法,可以调用__xxx
的属性和方法,也可以被继承下来。
_xxx
属性和方法 用from moudle import *
的方法是无法导入的,但是,只要是子类就可以正常调用和继承,外部导入需要使用from moudle import _XXX
但是,注意,继承和调用是两码事
__xxx
方法连调用都调用不了,完全的私有化
可以由如下代码解释:
#coding=utf-8
class Person(object):
# 定义类的一些属性
GG = "niuniu"
_name = "lala"
__family = "tos"
def __init__(self, name, age, taste):
self.name = name
self._age = age
self.__taste = taste
def showperson(self):
print(self.name)
print(self._age)
print(self.__taste)
def dowork(self):
self._work()
self.__away()
def _work(self):
print('my _work')
def __away(self):
print('my __away')
class Student(Person):
def construction(self, name, age, taste):
self.name = name
self._age = age
self.__taste = taste
def showstudent(self):
print(self.name)
print(self._age)
print(self.__taste)
@staticmethod
def testbug():
_Bug.showbug()
def squrt(self):
self._work()
print(self._name)
# print(self.__family)
self.__away() ## 这块会报错,因为不能继承和调用父类的这种方法
# 模块内可以访问,当from cur_module import *时,不导入
class _Bug(object):
@staticmethod
def showbug():
print("showbug")
s1 = Student('jack', 25, 'football')
s1.showperson()
print('*'*20)
# 无法访问__taste,导致报错
# s1.showstudent()
s1.construction('rose', 30, 'basketball')
s1.showperson()
print('*'*20)
s1.showstudent()
print('