Python属性

在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,下面的代码就可以验证这一点。之所以这样设定,可以用这样一句名言加以解释,就是“We are all consenting adults here”。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。

在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问。所以大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻

class Test:

    def __init__(self, foo):
        self.__foo = foo

    def __bar(self):
        print(self.__foo)
        print('__bar')


def main():
    test = Test('hello')
    test._Test__bar()
    print(test._Test__foo)


if __name__ == "__main__":
    main()

静态方法和类方法

之前,我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息。实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题,代码如下所示。

from math import sqrt


class Triangle(object):

    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c

    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b

    def perimeter(self):
        return self._a + self._b + self._c

    def area(self):
        half = self.perimeter() / 2
        return sqrt(half * (half - self._a) *
                    (half - self._b) * (half - self._c))


def main():
    a, b, c = 3, 4, 5
    # 静态方法和类方法都是通过给类发消息来调用的
    if Triangle.is_valid(a, b, c):
        t = Triangle(a, b, c)
        print(t.perimeter())
        # 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
        # print(Triangle.perimeter(t))
        print(t.area())
        # print(Triangle.area(t))
    else:
        print('无法构成三角形.')


if __name__ == '__main__':
    main()

 

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
### 属性的定义与分类 在 Python 中,属性可以分为 **实例属性** 和 **类属性** 两大类。它们分别用于描述类的实例和类本身的特征。 - **实例属性** 是与类的实例相关联的数据,通常在 `__init__` 方法中定义。例如: ```python class Person: def __init__(self, name): self.name = name # 实例属性 ``` 上述代码中,`name` 是一个实例属性,每个 `Person` 实例都可以拥有不同的 `name` 值。 - **类属性** 是类本身拥有的属性,所有实例共享同一个类属性。类属性通常直接在类体中定义,而不是在 `__init__` 方法中。例如: ```python class Person: species = "Human" # 类属性 def __init__(self, name): self.name = name ``` 在此代码中,`species` 是一个类属性,所有 `Person` 实例默认共享该属性值。 ### 属性的访问与修改 - **访问属性** 可以通过点号操作符实现。例如: ```python p = Person("Alice") print(p.name) # 输出: Alice print(Person.species) # 输出: Human ``` - **修改属性** 的值可以通过赋值操作完成。例如: ```python p.name = "Bob" Person.species = "Alien" ``` 上述代码中,`p.name` 被修改为 `"Bob"`,而 `Person.species` 被修改为 `"Alien"`。 ### 私有属性与访问控制 Python 支持通过命名约定来定义 **私有属性**,以限制外部直接访问。私有属性通常以双下划线 `__` 开头。例如: ```python class Person: def __init__(self, name): self.__name = name # 私有属性 def get_name(self): return self.__name ``` 在此代码中,`__name` 是一个私有属性,外部无法直接访问。可以通过定义 `get_name` 方法来提供访问接口。 ### 魔法属性 Python 中的一些 **魔法属性** 提供了对类或实例的元信息访问功能。常见的魔法属性包括: - `__dict__`:返回类或实例的所有属性的字典表示。例如: ```python p = Person("Alice") print(p.__dict__) # 输出: {'_Person__name': 'Alice'} ``` - `__class__`:返回对象所属的类。例如: ```python p = Person("Alice") print(p.__class__) # 输出: <class '__main__.Person'> ``` - `__name__`:返回类的名称。例如: ```python print(Person.__name__) # 输出: Person ``` - `__bases__`:返回类的基类(父类)元组。例如: ```python class Animal: pass class Person(Animal): pass print(Person.__bases__) # 输出: (<class '__main__.Animal'>,) ``` - `__mro__`:返回类的方法解析顺序(Method Resolution Order)。例如: ```python print(Person.__mro__) # 输出: (<class '__main__.Person'>, <class '__main__.Animal'>, <class 'object'>) ``` ### 属性管理与动态特性 Python 允许在运行时动态添加或删除属性。例如: ```python p = Person("Alice") p.age = 30 # 动态添加属性 del p.age # 删除属性 ``` 上述代码中,`age` 属性被动态添加到 `p` 实例中,随后又被删除。 ### 相关问题 1. Python 中类属性和实例属性的区别是什么? 2. 如何在 Python 中实现私有属性的访问和修改? 3. 魔法属性 `__dict__` 和 `__class__` 的作用分别是什么? 4. Python 中如何动态添加或删除对象的属性? 5. 方法解析顺序(MRO)在 Python 中是如何确定的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值