类的特性

一、概述

1.定义类(class Dog(object))--> 实例化(d = Dog())---> 实例对象(d)

2. __init__() 构造函数

3. self.name = name  类的属性、成员变量

4. def say_hi()   类的方法 、动态属性

二、访问类的属性

class Role(object):
    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("%s is shooting..." % self.name)

    def got_shot(self):
        print("ah...,%s got shot..." % self.name)

    def buy_gun(self, gun_name):
        print("%s just bought %s" % (self.name,gun_name))

r1 = Role(‘Alex‘, ‘police‘, ‘AK47‘)  # 生成一个角色
r2 = Role(‘Jack‘, ‘terrorist‘, ‘B22‘)   # 生成一个角色

  

  2.1 访问类的属性和方法

  我们用 实例对象.属性/方法 来访问

r1.shot()    #  调用shot 方法
r2.buy_gun(‘B13‘)  # 调用 buy_gun的方法并传参
print(r1.role)   # 打印类的属性

# 输出

Alex is shooting...
Jack just bought B13
police

 

  2.1 修改对象的属性

  在上例中我们为r2这个角色更换了武器,即 B22 --> B13。但实际上我们调用r2这个角色的武器属性是,会发现他的武器没有改变:

r2.buy_gun(‘B13‘)
print(r2.weapon)

# 输出
Jack just bought B13
B22       # 可以发现武器依然是 B22

  其实我们可以在购买武器是直接改变对象的属性:

def buy_gun(self, gun_name):
      print("%s just bought %s" % (self.name, gun_name))
      self.weapon = gun_name    # 在方法内改变属性

r2.buy_gun(‘B13‘)
print(r2.weapon)

#输出
Jack just bought B13
B13    # 可以发现武器已经改变

  

三、私有属性

  3.1、定义私有属性

  类的属性一旦被定义成私有属性,就不能被外部调用和随意修改。私有属性只能在类是内部使用。

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.__address = address   # 定义一个私有属性

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
print(p1.name)
print(p1.__address)   # 访问私有属性

# 输出

Bigberg
  File "G:/python/untitled/study6/类的私有属性.py", line 17, in <module>
    print(p1.__address)
AttributeError: ‘Person‘ object has no attribute ‘__address‘

  运行的结果是访问属性name是可以通过的,但是直接访问私有属性 self.__address 报错了。但是如果通过其他的方法,还是可以访问的到的。

  3.2、get的方法访问私有属性

  外部不能直接访问私有属性,但是在类的内部可以访问,所以我们可以定义一个方法来获取私有属性。  

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.__address = address

    def get_private(self):
        return self.__address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
res = p1.get_private()
print(res)

# 输出
hz

  

  3.3 强制访问私有属性

  我们还可以通过一种方法来强制访问私有属性,甚至修改私有属性的值。方法:对象名._类名__属性名。

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.__address = address

    def get_private(self):
        return self.__address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)

print(p1._Person__address)   # 访问私有属性

print("----change----")
p1._Person__address = ‘BJ‘    # 修改私有属性
print(p1._Person__address)

#输出
hz
----change----
BJ

  

四、总结

1、定义私有属性:self.__private_attr_name = private_attr_name

2、强制访问私有属性:对象名._类名__属性名(d._dog__sex)

3、对外提供只读接口访问:

    def get_sex(self):

      return self.__sex

时间: 2024-10-13 00:45:35

类的特性的相关文章

JQuery给元素动态增删类或特性

背景:通过JQuery动态给Html元素增加.删除类或属性,使Html元素在不同的时刻呈现不同的样式,给用户更好的体验感觉. 如存在以下p片段和button按钮,代码如下: 1 <p id="pDisplay">现在的背景颜色是白色,点击按钮以后背景变为红色</p> 2 <button id="changeColor">更改颜色</button> 存在如下css代码: 1 <style> 2 .colorR

反射+type类+Assembly+特性

什么是元数据,什么是反射: 程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据. 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中. 程序在运行时,可以查看其它程序集或其本身的元数据.一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射. 下面我们我们来学习如何使用Type类来反射数据,以及如何使用特性来给类型添加元数据. Type位于System.Reflection命名空间下 Type类 预定义类型(i

Java语言类的特性

一.内容的概述(主要内容) *类的私有成员和公共成员 *方法的重载 *构造方法 *类的静态方法 *对象的应用 二.类的私有成员和公有成员 私有成员:加private访问控制修饰符 公有成员:加public访问控制修饰符 如果没有一个机制来限制对类中成员的访问,则很有可能会造成错误的输入.为了防止这样的情况发生,Java语言提供了私有成员访问控制修饰符private..也就是说,如果在类的成员声明前加上修饰符private,则就无法从该类的外部访问到该类内部的成员,而只能通过该类自身访问和修改,而

Python面向对象类成员特性

特性的存在就是将方法伪装成字段. property 把类方法当做普通字段去调用,即用对象调用的时候后面不用加括号 #!/usr/bin/env python # _*_coding:utf-8 _*_ class Foo:    @property    def Characteristic(self):        print("类方法的特性") # 创建一个对象 obj = Foo() # 调用类方法的时候方法后面不用加括号 obj.Characteristic 输出 /usr/

Java中Stringbuffer、Arrays、Interger、Character类的特性

1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类.StringBuffer供我们使用. (2)StringBuffer的构造方法 A:StringBuffer() B:StringBuffer(int size) C:StringBuffer(String str) (3)StringBuffer的常见功能 A:添加功能 public StringBuffer append(St

类--其他特性,作用域,构造函数,静态成员

一.类的其他特性 1.类成员再探 1)定义一个类型成员 除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名.由类定义的类型名字和其他成员一样存在访问限制,可以是public或者private中的一种.用来定义类型别名的成员必须先定义后使用,因此,类型成员通常出现在类开始的地方. 1 // 一个窗口类 2 class Screen 3 { 4 public: 5 typedef std::string::size_type pos; 6 private: 7 pos m_cursor

类之特性

# 成员: 静态字段 静态方法 类方法 普通方法 # 面向对象值特性 class NameInfo(object): def __init__(self,name ,sex,address): self.name = name self.sex = sex self.address = address # 特性,将方法伪造成字段 @property def find_address(self): # 查询地址 print(self.address) # 特性设置值 @find_address.s

Java基础之三、类的特性和接口

类的派生.多态.抽象类.接口 1:派生-extends 派生就是继承已有类非私有的字段和方法等创建新的类,还可以添加.重写字段和方法: 在类的派生中,构造函数不可以被继承: 派生源的类-父类/基类/超类;派生的类-子类/派生类; 2:super(…)调用超类的构造函数,在子类构造函数的开头: super(…)和this(…)不能同时存在构造函数中,因为都必须在开始调用: 3:子类的构造函数中如果无显示调用超类构造函数,则会自动调用超类中的“不接收参数的构造函数”; X(……){super();}

新年在家学java之基础篇-高级类的特性

继承 extends 子类的共性代码都是继承自父类的,每个子类只要写自己特有的代码 class 子类 extends 父类 继承提高了代码的复用性,提供了多态的前提,但是不要为了某个功能去继承 子类不是父类的子集,而是对父类的扩展 规则:子类不能直接访问父类中private的成员变量和方法 只支持单继承,不能多重继承,可以多层继承.子类只能有一个父类 方法的重写override 子类重写父类的方法,只是重新编写方法体代码,如果父类的方法是public ,子类重写时就不能使用缺省以下的修饰符 al