美文网首页
2018-08-01Python (12)

2018-08-01Python (12)

作者: 棕色试剂瓶 | 来源:发表于2018-08-01 13:28 被阅读0次

python基础语法(12)

私有属性

_XX

但下滑线开头的变量是protected类型的变量。

只能允许其本身与子类进行访问。
当在不同的包中时,用from导入不会把此类性的变量导入

代码实例:
User package:

class User(object):
    def __init__(self,name,age):
        self._name = name
        self.age = age 

Use package:

from week3.unit2.User.user_class import User

user1 = User("daming","21")
print(user1.name)  

这个时候会报错,因为_name时protected类型,不能跨包调用。但是可以使用age属性。

但是由于python中不存在(真实的私有属性)所以

__XX

双下划线表示私有类型的变量。只允许类本身进行访问,子类都不可以访问。可以通过类内部的方法进行内部访问。
(python中不存在私有类型的变量,当python识别到你声明一个双下划线开头的变量是,它会在后台悄悄的将变量名改为类名_变量名,来防止外部调用。)

代码实例:

class User(object):
    __id = "001"
    def __init__(self,name,age):
        self.name = name
        self.age = age

user1 = User("daming","21")

print(User.id)
print(User._User__id)  

第一条输出一句会报错,第二条输出语句能够正常输出。
也可以通过内部方法调用来输出。

代码实例:
class User(object):
__id = "001"
def init(self,name,age):
self.name = name
self.age = age
@classmethod
def retur(cls):
return cls.__id

user1 = User("daming","21")

print(User.retur())  

XX

xx定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , import,或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名

python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰.但是可以在变量前面加上两个下划线"",这样的话函数或变量就变成私有的.这是python的私有变量轧压(这个翻译好拗口),英文是(private name mangling.) **情况就是当变量被标记为私有后,在变量的前端插入类名,再类名前添加一个下划线"",即形成了ClassName_变量名

python的内置类属性

 __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

只读属性

@property

采用访问属性的方式访问方法。
代码实例:

class Car:
__wheels=4
__voice='didi'
def __init__(self,color):
    self.color=color
    self.speed=80
@property
def run(self):
    print('i can run %d speed'%self.speed)

@run.setter
def run(self,wh):
    self.speed=wh

car1=Car('blue')

print(car1.color)
car1.run=120
car1.run  

通过该方法调用方法时,方法名后不用加括号。
被修饰过的方法不能通过del 类名.方法名 来删除,因为它不是属性。

静态方法

@staticmethod

普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。
代码实例:

class Car:
__wheels=4
__voice='didi'
def __init__(self,color):
    self.color=color
@property
def wheels(self):
    return self.__wheels

#静态方法在类中也不需要传入 self参数
@staticmethod
def wash():
    print('i am washing')  

类方法

@classmethod

通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
代码实例:

class Car:
__wheels=4
__voice='didi'
def __init__(self,color):
    self.color=color
@property
def wheels(self):
    return self.__wheels

@classmethod
def dudu(cls):
    print(cls.__voice)

@staticmethod
def wash():
    print('i am washing')

相关文章

网友评论

      本文标题:2018-08-01Python (12)

      本文链接:https://www.haomeiwen.com/subject/vaolvftx.html